JavaScript promises 和 async await 有什么区别?

新手上路,请多包涵

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

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

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

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

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

随着时间的推移,我发现了 ECMAScript 7 的特性,其中之一是 ASYNCAWAIT 关键字/函数。这些结合在一起创造了奇迹。我已经开始用 async & await 替换我的一些承诺。它们似乎为编程风格增加了很大的价值。

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

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

撇开语法错误(如果有的话)不谈,我觉得它们做的事情完全一样。我几乎已经能够用 async,waits 替换我的大部分承诺。

当 promise 做类似的工作时,为什么需要 async,await?

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

正如我之前所说,我能够使用 promises 和 async,await 来解决同样的问题。 async await 有什么具体解决的吗?

补充说明:

我一直在我的 React 项目和 Node.js 模块中广泛使用异步、等待和承诺。 React 尤其是早起的鸟儿,采用了很多 ECMAScript 6 和 ECMAScript 7 特性。

原文由 bozzmob 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 202
2 个回答

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

async/await 只是让您对异步代码有一种同步的感觉。这是一种非常优雅的语法糖形式。

对于简单的查询和数据操作,Promises 可以很简单,但是如果你遇到复杂的数据操作和其他不涉及的场景,如果代码只是 看起来 好像是同步的(换句话说,语法本身是一种“附带复杂性”的形式 async/await 可以绕过)。

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

原文由 Josh Beam 发布,翻译遵循 CC BY-SA 3.0 许可协议

Async/Await 在更复杂的场景中提供了更好的语法。特别是,任何处理循环或某些其他结构的东西,如 try / catch

例如:

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

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

原文由 Stephen Cleary 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题