【发布时间】:2020-09-20 20:39:14
【问题描述】:
如果我理解正确,使用关键字 async 声明的函数应该返回一个承诺。在 async3 函数的情况下,我们有 10 亿次迭代,这使得返回值需要更长的时间。分析下面的代码,我预计会发生的是,通过调用 sync1 和 sync2 函数,立即登录控制台,稍后会出现 async3 函数日志.但是,我注意到 sync1 和 sync2 函数仅在 async3 结束后才记录。 async3 函数是否应该在另一个线程上或事件循环之外运行而不会阻塞在运行时调用的其他函数的执行?
function sync1() {
console.log(1);
}
function sync2() {
console.log(2);
}
async function async3() {
let iteration = 0;
let number = 0;
while (iteration <= 1000000000) {
number = iteration;
iteration++;
}
return number;
}
sync1();
sync2();
async3().then((val) => console.log(val));
你能解释一下它为什么会这样吗?我错过了什么?
我的预期:
sync1(); // console logged immediately
sync2(); // console logged immediately
async3().then((val) => console.log(val)); // console logged moments later
目前正在发生的事情:
同步1(); // async3 完成后记录控制台 同步2(); // async3 完成后记录控制台 async3().then((val) => console.log(val)); // async3 完成后记录控制台【问题讨论】:
-
你在 async3 中的代码是完全同步的。 Nodejs 在单个线程中运行该 Javascript,因此在同步循环完成之前它不能运行其他任何东西。
async关键字不会使同步代码突然变为异步。您的async3函数同步运行您的循环,然后返回一个已履行的承诺。 -
另外,
console.log()有自己的问题,即它何时显示某些内容。直观地看到日志语句何时显示并不代表真正的代码流。它应该代表正确的顺序,但不一定代表正确的时间。
标签: javascript async-await es6-promise