JavaScript异步/等待不等待正常?

时间:2018-04-18 00:45:17

标签: 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");




我希望这会在45之间等待一秒钟后返回以下内容:

1
2
3
4
5
6
"foo"

相反,在Chrome 64.0.3282.167和Firefox 58.0.2的控制台中尝试此操作后,我会收到:

1
2
3
4
6
undefined
5

有人可以指出我在哪里出错吗?

1 个答案:

答案 0 :(得分:2)

顶级正在同步运行(一如既往) - 在继续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);
})();