如何等待异步函数?

Tân*_*Tân 3 javascript asynchronous ecmascript-2017

我的情况:

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...');
Run Code Online (Sandbox Code Playgroud)

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

首先:

await waiting();
Run Code Online (Sandbox Code Playgroud)

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

第二:

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

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

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

Est*_*ask 5

这不是一个函数,而是一个它返回的值,它用await语句等待。

async和正常功能与调用者没有什么不同。async在被调用时只返回一个承诺而不明确返回它。waitingAsync()调用的结果是一个承诺。waiting()call的结果也是一个 promise,所以它不是“同步的”。

根据规范,promises 和 non-promises 都可以被await编辑。非承诺被转换为承诺Promise.resolve()

console.log('done...')不能等待,因为它不在async函数内部调用。并且它不必被awaited 因为它不返回一个 promise 而是undefined. awaitasync函数中它是可能的。这些await用法是相同的,同样无用,它们所做的只是 1 个滴答延迟:

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

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

async function ... {
  ...
  await Promise.resolve(console.log('done...'));
}
Run Code Online (Sandbox Code Playgroud)