JavaScript async/await 没有正确等待?

标签 javascript asynchronous async-await ecmascript-2017

我在使用 JavaScript 的异步/等待函数时遇到问题。这是在我无法共享源代码的内部应用程序上发生的,但我将我的问题的快速通用复制放在一起:

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

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

最佳答案

顶层是同步运行的(一如既往)——它不会等待 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);
})();

关于JavaScript async/await 没有正确等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49889453/

相关文章:

javascript - 如何动态添加带有 Bootstrap 表单元素的 div?

javascript - 如何检查一个对象数组是否完全属于另一个对象?

asynchronous - 在 Dart 中 Future.wait 真的是异步的吗?

c# - 如何使用 C# 使用 Protobuf 进行非阻塞套接字读取?

javascript - 我可以对变量调用 ".log"

javascript - 使用 jQuery 选择器编辑帖子

sql-server-2008 - SQL Server 在线程中触发并运行 CLR 方法

javascript - 如何异步更改数据数组项、添加和切片

c# - 有没有办法同步运行异步 lambda?

C# 异步,为什么我们需要 "hold"控制台来获取异步结果?