请考虑以下代码段:
我从功能callback
调用dothis
。请注意,callback
中的dothis
在timeout
console.log("start");
doThis(":)", callback)
function callback(a) {
console.log('in callback '+ a)
}
function doThis(a,cb) {
setTimeout(() => {
cb(a)
}, 2000);
console.log('in first function')
}
console.log("end")
我得到以下结果:
start
in first function
end
in callback :)
现在考虑以下内容,
除了这次没有timeout
以外,其他都一样:
console.log("start");
doThis(":)", callback)
function callback(a) {
console.log('in callback '+ a)
}
function doThis(a,cb) {
cb(a);
console.log('in first function')
}
console.log("end")
我得到以下结果:
start
in callback :)
in first function
end
timeout
似乎显示了预期的异步行为。没有超时,我的代码的行为就像根据记录的消息同步调用回调一样。我对运行到完成语义的理解使我认为,无论处理回调需要多长时间,我都应该始终获得第一个结果。我的理解是JavaScript会一直执行当前活动(JavaScript代码),并且所有异步活动(回调)都将排入队列(在事件队列中),以便以后执行。 在这种情况下,如果回调的结果准备好了,那么它将记录在以下消息之前。如果延迟,则最后记录一次。这是异步行为吗?
答案 0 :(得分:0)
考虑代码的这一部分:
console.log("start");
doThis(":)", callback)
function callback(a) {
console.log('in callback '+ a)
}
function doThis(a,cb) {
setTimeout(() => {
cb(a)
}, 2000);
console.log('in first function')
}
console.log("end")
您有doThis
,这是一个在内部调用回调函数的函数,但是堆栈在调用callback(a)
之后等待并执行第二个函数,也许您希望代码按顺序执行所有操作但是这里的窍门是执行堆栈调用第一个函数(doThis
)但等待计时器。