JavaScript promise 和 async await 之间有什么区别?

我一直在我的应用程序中使用 ECMAScript 6 和 ECMAScript 7 的功能(感谢 Babel) - 包括移动和 Web。

第一步显然是 ECMAScript 6 级别。我学到了许多异步模式,承诺(非常有前途),生成器(不确定为什么是*符号)等。从这些中,承诺非常适合我的目的。我一直在我的应用程序中使用它们。

以下是我如何实现基本承诺的示例/伪代码 -

var myPromise = new Promise(
    function (resolve,reject) {
      var x = MyDataStore(myObj);
      resolve(x);
    });

myPromise.then(
  function (x) {
    init(x);
});

随着时间的流逝,我遇到了 ECMAScript 7 的功能,其中之一是关键字/函数。这些结合在一起创造了巨大的奇迹。我已经开始用.它们似乎为编程风格增添了巨大的价值。ASYNCAWAITasync & await

同样,这是我的异步,await函数的伪代码-

async function myAsyncFunction (myObj) {
    var x = new MyDataStore(myObj);
    return await x.init();
}
var returnVal = await myAsyncFunction(obj);

撇开语法错误(如果有的话)不谈,它们都做了完全相同的事情,这就是我的感觉。我几乎能够用异步,等待来取代我的大部分承诺。

为什么当承诺做类似的工作时,需要异步,await?

async,await是否解决了更大的问题?还是只是回调地狱的另一种解决方案?

正如我之前所说,我能够使用承诺和异步,等待来解决同样的问题。是否有任何特定的异步等待解决?

附加说明:

我一直在我的 React 项目和 Node.js模块中广泛使用 async、awaits 和 promise。特别是 React 已经起步了,它采用了很多 ECMAScript 6 和 ECMAScript 7 的功能。


答案 1

为什么当 Promises 做类似的工作时需要 async,await?async,await是否解决了更大的问题?

async/await只是给你一个异步代码的同步感觉。这是一种非常优雅的语法糖形式。

对于简单的查询和数据操作,Promises可能很简单,但是如果您遇到复杂的数据操作和不涉及的内容的场景,如果代码只是看起来好像是同步的,那么更容易理解发生了什么(换句话说,语法本身就是一种可以绕过的“附带复杂性”)。async/await

如果你有兴趣知道,你可以使用像co这样的库(与生成器一起)来提供相同的感觉。像这样的东西已经开发出来,以解决最终解决的问题(本地)。async/await


答案 2

异步/等待在更复杂的方案中提供了更好的语法。特别是,任何处理循环或某些其他构造(如 /)的内容。trycatch

例如:

while (!value) {
  const intermediate = await operation1();
  value = await operation2(intermediate);
}

仅使用 Promises,这个例子会更加复杂。