【发布时间】:2018-10-08 11:20:29
【问题描述】:
我对 JavaScript 的异步行为概念不熟悉。
下面的代码让我很困惑。根据我的概念,函数 b 应该在等待函数完成执行之前返回,因为我没有告诉它使用“等待”等待。 但我得到的输出是这样的: 前 然后等待 6 秒 后 在b之后
预期输出: 前 后 在 b 之后 无需等待 6 秒 这是代码:
function wait(ms)
{
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
async function b () {
console.log('before');
wait(6000);
console.log('after');
}
async function c () {
b()
console.log('after b');
}
c();
请帮助我更好地理解这个概念
【问题讨论】:
-
它等待的原因是因为
wait函数内部的循环是一个“忙循环”。它绑定了活动的“线程”,因此异步代码不会暂停。 -
我对这个预期的输出感到困惑:
before after after b without waiting for 6 seconds在before和after之间应该总是有 6 秒的暂停。但是,before b可能会根据所使用的等待方法出现在不同的位置。 -
@cleberz 据我所知(我可能错了,如果我错了,请纠正我)在 b 打印“之前”之后,执行线程将继续执行等待函数,但因为 b 是异步函数所以'after'会立即打印。为了停止这种情况,我们需要使用等待,所以我们告诉执行线程等待,直到响应从等待函数返回
-
async关键字不会使函数异步。它唯一能做的就是允许你在函数中使用await关键字(await关键字在其他任何地方都无效) -
@slebetman 好的,现在我明白了。那么如何以及何时决定一个呼叫是否为异步呼叫?感谢 bdw 的回答
标签: node.js asynchronous async-await