相关疑难解决方法(0)

JavaScript 中的异步函数是什么?JavaScript 中的“async”和“await”是什么?

本问答旨在明确回答以下问题:

  • JavaScript 中的异步函数是什么,我们何时以及如何使用它们?
  • JavaScript中的async,await关键字是什么,它们与异步函数有什么关系?

要遵循答案,需要以下先决条件:

  • JavaScript 异步编程模型的知识
  • ES6 Promise 对象知识

javascript asynchronous promise async-await es6-promise

3
推荐指数
1
解决办法
556
查看次数

异步函数何时实际返回待处理的承诺?

我用谷歌搜索了这个问题很多次,但我看到这个问题的唯一答案是:

异步函数总是返回一个承诺

但我没有找到任何可以回答这种情况何时真正发生的问题。

是进入异步函数后立即执行还是遇到第一个await关键字后立即执行?

我刚刚写了这段代码:

async function main() {
  console.log(true);
  let p = await new Promise(r => setTimeout(r, 2000, 100));
  return p;
}
async function f() {
  inner(await main())

  function inner(d) {
    console.log(d + 10)
  }

  console.log('done')
}

f();
Run Code Online (Sandbox Code Playgroud)

最重要的一行是:

inner(await main())
Run Code Online (Sandbox Code Playgroud)

main()将首先执行,因为函数调用在优先级表中具有更高的优先级,并且当异步函数返回一个承诺时,它返回一个待处理的承诺!

但要返回它,我们必须首先执行 main(),因此它进入主执行上下文并看到console.log(true);

现在,这就是 ? 返回待处理的承诺的地方吗main()

或者它会记录下来,然后到达关键字await,然后返回一个待处理的承诺?

如果这是我们的代码怎么办:

inner(await main())
Run Code Online (Sandbox Code Playgroud)

现在在这种情况下,这一main()行会inner(await main())立即返回一个待处理的承诺,还是需要 30 秒才能返回一个待处理的承诺?

现在我的猜测是:

该行将inner(await main())立即返回一个待处理的承诺,但 main() 内的代码将继续执行,直到到达第一个等待关键字,这是正确的吗?

javascript asynchronous promise

3
推荐指数
1
解决办法
862
查看次数

请指出我学习异步Javascript过程中的错误

我是 Javascript 和异步编程的新手,有些事情让我感到困惑,请指出我学习中的错误。

  • 异步函数的回调被放入消息队列中并通过事件循环执行。
  • 异步执行是非阻塞的,通过事件循环完成。
  • 像这样的函数setTimeout是异步的。
  • 异步函数是阻塞的,只有它们的回调是非阻塞的。

以上如有错误,请指出。

javascript asynchronous node.js

2
推荐指数
1
解决办法
531
查看次数