async / await如何在异步函数中使用回调?

时间:2017-01-27 17:37:50

标签: javascript ecmascript-2017

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可能会发生在后台。

1 个答案:

答案 0 :(得分:2)

您在上面说“asyncPromise”。你是对的。它是。对于承诺而言,它基本上是语法糖,使它们在某些情况下更容易遵循。

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

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被解析。 一切等待承诺得到解决:功能基本上暂停。

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