【问题标题】:How does async/await work with callbacks in the async function?async/await 如何处理异步函数中的回调?
【发布时间】:2017-06-13 11:35:04
【问题描述】:
async setMyPhotos() {
  const newPhotos = await Promise.all(newPhotoPromises);

  someOtherPromise();  // will wait for newPhotoPromises

  syncAvatar(newPhotos[0], function(res, err) {  // does this wait for newPhotoPromises too?
    if (!err) console.log("avatar sync'd");
  });

  return newPhotos;  // return just needs to wait for newPhotoPromises
}

我注意到syncAvatar 似乎有效,但我不确定我是否只是走运。如果是这样,我如何确保 syncAvatar 仅在 newPhotoPromises 完成后运行?

澄清一下,syncAvatar 需要在 newPhotoPromises 完成之后发生,但是 setMyPhotos 只需要返回 newPhotoPromises 的结果,而 syncAvatar 可以在后台发生。

【问题讨论】:

  • async/await 是 C# 吗?
  • JavaScript ES7 也是!
  • 我很困惑,因为标签只是 javascript :P
  • 并不是说“回调也有效”。这是执行暂停,直到满足等待。然后,无论接下来发生什么,都会执行。
  • async/await 不是 ES7 (ES2016) 的一部分。它成为今年发布的 ES2017 的一部分。

标签: javascript ecmascript-2017


【解决方案1】:

您在上面说“asyncPromise 的东西”。你说得对。它是。它基本上是围绕 Promise 的语法糖,使它们在某些情况下更易于遵循。

在这种情况下,函数实际上可以重写为如下所示:

setMyPhotos() {
  return Promise.all(newPhotoPromises)
    .then(newPhotos => {
      someOtherPromise();

      syncAvatar(newPhotos[0], function(res, err) {
        if (!err) console.log("avatar sync'd");
      });

      return newPhotos;
    });
}

await 基本上告诉 Javascript 引擎在执行其余函数之前等待Promise 被解析。 一切都在等待 promise 被解决:函数基本上暂停了。

一个async 函数又总是返回一个Promise,就像上面的等效代码一样。

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2020-05-15
    • 2021-06-06
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多