如何等待异步函数?

2024-03-24

My case:

let waiting = function () {
  return new Promise(resolve => {
    console.log('awaiting...');
    
    setTimeout(function () {
      resolve();
    }, 1000)
  });
};

let waitingAsync = async function () {
  console.log('start...');

  await waiting();

  console.log('stop...');
};

waitingAsync();
console.log('done...');

代码中有两件事我不明白:

首先:

await waiting();

waiting是一个同步函数(因为它没有async关键词)。那么,为什么我可以等待同步函数呢?

第二:

为什么不能done...完成后等待消息waitingAsync功能?

主要问题:waitingAsync是一个异步函数,为什么await调用时不需要关键字?只是waitingAsync()代替await waitingAsync().

如果我可以等待waitingAsync(), done...消息将最后打印。


这不是一个函数,而是一个它返回的值,等待它await陈述。

async正常的函数对于调用者来说没有什么不同。async只是返回一个承诺,而不会在被调用时显式返回它。的结果waitingAsync()打电话就是一个承诺。的结果waiting()call 也是一个承诺,所以它不是“同步”的。

根据the spec https://github.com/tc39/ecmascript-asyncawait,承诺和非承诺都可以await编辑。非承诺将转换为承诺Promise.resolve().

console.log('done...')无法等待,因为它没有在内部调用async功能。不一定是这样awaited 因为它不返回承诺但是undefined. await这将有可能在async功能。这些await用法是相同的,同样没用,它们所做的只是 1 个刻度延迟:

async function ... {
  ...
  await console.log('done...');
}

async function ... {
  ...
  console.log('done...');
  await undefined;
}

async function ... {
  ...
  await Promise.resolve(console.log('done...'));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何等待异步函数? 的相关文章

随机推荐