JavaScript async/await 没有正确等待?

Cap*_*ous 4 javascript asynchronous async-await ecmascript-2017

我遇到了 JavaScript 的 async/await 函数的问题。这发生在我无法共享源的内部应用程序上,但我将我的问题的快速通用复制放在一起:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function baz(input) {
  console.log("4");
  await sleep(1000);
  console.log("5");
  return input;
}

async function bar(input) {
  console.log("3");
  return await baz(input);
}

async function foo() {
  console.log("2");
  const foo = await bar("foo");
  return foo;
}

console.log("1");
foo();
console.log("6");
Run Code Online (Sandbox Code Playgroud)

我希望这会返回以下内容,4并在和之间等待一秒钟5:

1
2
3
4
5
6
"foo"
Run Code Online (Sandbox Code Playgroud)

相反,在 Chrome 64.0.3282.167 和 Firefox 58.0.2 的控制台中尝试了这个之后,我收到了这个:

1
2
3
4
6
undefined
5
Run Code Online (Sandbox Code Playgroud)

请有人指出我哪里出错了吗?

Cer*_*nce 8

顶层同步运行(一如既往) -foo();在继续运行之前,它不会等待解析console.log("6");。将调用包装foo在异步和await它中。foo如果要稍后显示,还需要保存返回值:

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function baz(input) {
  console.log("4");
  await sleep(1000);
  console.log("5");
  return input;
}

async function bar(input) {
  console.log("3");
  return await baz(input);
}

async function foo() {
  console.log("2");
  const foo = await bar("foo");
  return foo;
}

(async () => {
  console.log("1");
  const str = await foo();
  console.log("6");
  console.log(str);
})();
Run Code Online (Sandbox Code Playgroud)

  • 事实证明,我给出的示例并不能准确地重现我遇到的问题。一旦我创建了准确的复制品,我将重新发布这个问题。由于您提供的答案确实回答了所提出的问题,并且可能会在将来帮助人们,因此我将继续将其标记为答案。谢谢! (2认同)