【问题标题】:JavaScript Async function doesn't non-blockJavaScript 异步函数不是非阻塞的
【发布时间】:2020-03-15 22:19:27
【问题描述】:

由于 async 函数是非阻塞的,我预计下面代码中的 asyncfunc 不会阻塞并且 console.log(a) 打印为零。

var a = 0;
const asyncfunc = async () => {
  for (let i = 0; i < 1000000000; i++) {}
  a = 1;

  return 2;
};

const asyncmain = async () => {
  a = asyncfunc();
  console.log(a);

  return true;
};

asyncmain();

但是当我执行时,asyncfunc 中的所有代码都先运行,然后写入控制台日志。函数首先在异步函数处被阻塞!

预期:0 实际:承诺 { 2 }

我无法理解这个结果。帮助我理解这个结果!

ps 我在 node.js v10.15.3 上运行了这段代码

【问题讨论】:

  • "由于异步函数是非阻塞的' 这是不正确的。异步函数将同步运行,直到遇到await。
  • 简单地说,将 async 关键字放在函数前面只是意味着函数返回的任何值都将包装在 Promise 中。

标签: javascript asynchronous async-await nonblocking


【解决方案1】:

如果要使用来自异步函数的结果,则必须使用 await 子句指定要等待它们使用它。

var a = 0;
const asyncfunc = async () => {
  for (let i = 0; i < 1000000000; i++) {}
  a = 1;

  return 2;
};

const asyncmain = async () => {
  a = await asyncfunc();
  console.log(a);

  return true;
};

asyncmain();

我建议您阅读此article 以全面了解异步函数的行为。

【讨论】:

  • 这仍然会让asuncfunc 完全执行,然后继续执行console.log 语句。
  • 没错,但你不能在没有等待的情况下使用a 值。
  • 但 OP 并没有询问 如何 使用结果,而是询问同步/异步行为
  • 这个article 详细解释了它是如何工作的
猜你喜欢
  • 2013-05-07
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 2015-08-03
相关资源
最近更新 更多