【发布时间】:2019-06-25 20:18:51
【问题描述】:
我正在创建一个包装函数,它将采用函数数组并以并行方式执行每个函数,因此考虑使用 setTimeout,但函数仍然按顺序运行。我怀疑这可能是因为用于调用 SetTimeout 的闭包。但是既然 setTimeout 无论如何都是异步的,为什么这很重要呢?
// some blocking functionality
var withDelay = function (a) {
var currentTime = new Date().getTime(), delay = 5000;
while (currentTime + delay >= new Date().getTime()) {
}
console.log(a+"I am with delay");
}
// some non blocking functionality
var withoutDelay = function(a) {
console.log(a+"I am with no delay");
}
var fnArr = [withDelay, withoutDelay]; //array of functions
var args = ["Hi,"]; // arbitrary params
for( var i=0; i < fnArr.length; i++) {
var fn = fnArr[i];
(function(f,arg) {
return setTimeout(function(){ return f.apply(f,arg) },0);
})(fn,args)
}
预期输出:
嗨,我马上就来
你好,我来晚了
但实际输出是:
你好,我来晚了
嗨,我马上就来
【问题讨论】:
-
quora.com/… 尝试阅读此内容,浏览器将异步调用推送到队列中。因此这种顺序行为
-
while函数内部的withDelay循环会冻结浏览器,然后这两个函数都会运行。而且由于您在fnArr中指定的顺序,withDelay将首先开火。
标签: javascript loops asynchronous closures settimeout