异步函数,promise和observable有什么区别?

时间:2018-06-14 07:43:18

标签: javascript async-await javascript-objects

任何人都可以解释何时使用异步和等待?

我想在angular应用程序类中编写一个方法,它将等待API调用的响应。改为使用Promise是好事吗?

如果它们都是异步的,那么何时使用Promise而不是异步函数?

什么是可观察物?他们与Promises有何不同?

1 个答案:

答案 0 :(得分:0)

这个问题有两个分支。

  1. 什么是异步函数,它们与promise构造函数有何不同以及什么是可观察的。
  2. 何时使用Observable和何时使用Promises / Async函数。

我知道填满维基页面的时间可能足够长,但是从务实的角度来看,它可以得到解答,并且对于实际创建实用的信息资源可能很有用。

关于第一个分支。

Promise:是一个包装值的对象,您可以通过promise的 then 方法与该值进行交互。您可以在https://promisesaplus.com/的javascript中了解有关Promises本身的更多信息。这对于异步操作特别有用,因为您可以将操作的含义对此类操作的结果将要做的操作去耦

异步函数:异步函数是通过异步语句修饰为异步的函数。在此函数中,您可以使用await来从promise中解包值,并且您返回的值将由Promise自动包装(因此您不必显式地返回promise)。这些对于异步操作特别有用,因为您可以将一组异步操作的控件这些操作组合的控制流去耦。您可以在https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/funcion_asincrona中了解有关异步功能的更多信息。

Observables:是一个对象,它包装随时间变化的值,通常将此变化描绘为一系列值。您可以使用订阅方法与值进行交互。您可以通过使用大理石http://rxmarbles.com/和文档来了解更多信息。我也推荐这篇文章https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

关于第二个分支:与往常一样,这取决于情况和问题。

当您从REST API或异步读取器请求值时,可以使用Promise,因为它是单个值并且Promise易于使用,学习曲线较低。

const getDataFromFile = (fileName) => new Promise(resolve => {
  readFile(fileName, content => resolve(content);
});

您可以使用Async函数根据各种REST API所请求的值进行计算和转换,也可以仅使用返回诺言的函数

async function concatFiles(fileName1, fileName2) {
  const content1 = await getDataFromFile(fileName1);
  const content2 = await getDataFromFile(fileName2);
  return content1 + content2; // or just `$`
}

您可以将可观察值用于随时间变化的值,可以解决事件的这些更改,也可以解决某些状态的值。就像选择一样,它将触发更改并包装一个值

Observable.fromEvent(selectElement, 'change').subscribe(e => console.log(e))

关于第二个分支:您使用适合该问题的

现在,Angular提出了一种架构特征,也许这个架构(或其他框架中的架构)要求您使用可观察对象,并且您必须对其进行处理。但是,如果可以选择,只需在合理的地方进行简化即可使用更适合该问题的方法。

问题的额外分支,或者所有这些结构是如何产生的以及为什么?

创建诺言,异步函数和可观察变量的原因有很多,所有这些都与反应性编程,异步,程序的非阻塞设计有关。

希望有帮助。