【问题标题】:Asynchronous code executing sequentially after wait instead of showing console output immediately等待后顺序执行的异步代码,而不是立即显示控制台输出
【发布时间】:2021-09-03 17:01:01
【问题描述】:

这是我的示例代码:

async function counter() {
    console.log('1');

    let next = new Promise((resolve) => {setTimeout(() => resolve(3), 5000)});

    let three = await next;

    console.log('2');
    console.log(three)
}

counter();

this question 上接受的答案是这样说的

当你同步执行某事时,你等待它完成 在继续执行另一项任务之前。当你执行某事时 异步,您可以在完成之前继续执行另一个任务。

据我了解,2 应该立即记录到控制台,因为该函数是异步的,它不应该等待另一个任务(承诺)完成(解决)。

但是,我看到的是 23 在等待 5 秒后一起记录在控制台中。这不是基于接受答案中的上述文本的同步函数会做什么吗?

谢谢。

【问题讨论】:

  • awaiting 承诺在记录 2 和 3 之前解决。这就是重点。
  • accepted answer 表示当代码按顺序执行时,代码会停止执行下一行,直到异步函数完成执行。完成后,它会移动到下一行
  • 谢谢@brk。 :) 我仍然很困惑,这一行“当你异步执行某事时,你可以在它完成之前继续执行另一个任务。”。似乎与停止执行下一行相反。
  • @RealNoob 所以在let next = …;let three = await next; 语句之间添加一些其他代码。或者也紧跟在counter(); 语句之后。

标签: javascript asynchronous async-await es6-promise


【解决方案1】:

await 表达式会导致异步函数执行暂停,直到 Promise 被解决(即完成或拒绝),并在完成后恢复异步函数的执行。恢复时,await 表达式的值是已实现的 Promise 的值。

你可以阅读更多关于AwaitHere的信息

你可以阅读更多关于this acccepted answer here

如果你在async 函数中使用await,基本上会发生什么,它会导致等待它直到promiseresolved。但在该函数之外仍将与该函数并行运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多