JavaScript async/await 没有正确等待?

Posted

技术标签:

【中文标题】JavaScript async/await 没有正确等待?【英文标题】:JavaScript async/await not awaiting properly? 【发布时间】:2018-09-28 02:10:18 【问题描述】:

我遇到了 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

请有人指出我在这方面哪里出错了?

【问题讨论】:

您还没有等待您致电foo 你就在那里,但这仍然不能解释为什么 foo() 返回 undefined 而不是 "foo" 因为你破坏了底层的承诺链。 你怎么能期望"foo" 被输出到控制台?你认为你的代码的哪一行输出了那个?你所有的console.log都是数字的,你不是一次console.log('foo') 【参考方案1】:

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

【讨论】:

对,但这并不能解释为什么它返回 undefined 而不是 foo undefined 是最后一个console.log 的“结果” ...在开发工具控制台中输入console.log('hello') ...输出为helloundefined 原来我给出的例子并没有准确地重现我遇到的问题。一旦我创建了一个准确的复制品,我将重新发布这个问题。由于您提供的答案确实回答了所提出的问题,并且将来可能会对人们有所帮助,因此我将继续将其标记为答案。谢谢!

以上是关于JavaScript async/await 没有正确等待?的主要内容,如果未能解决你的问题,请参考以下文章

javascript 中的 async/await 示例

简单理解JavaScript 的async/await

理解 JavaScript 的 async/await

Javascript中的async await

Javascript中的async await

Javascript中的async await