我正在创建一个包装函数,它将采用函数数组并以并行方式执行每个函数,因此考虑使用 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)
}
预期输出:
Hi,I am with no delay
Hi,I am with delay
但实际输出是:
Hi,I am with delay
Hi,I am with no delay
最佳答案
JS 在单线程上运行,您的函数不会并行运行。它一次只会运行一个。由于您已将这两个函数安排为 0 延迟,与 fnArr
数组即第一个函数一样。 withDelay
将首先运行。只有当它完成执行时,第二个函数withoutDelay
才会开始执行。 setTimeout
不会保证您在提供的时间间隔后执行,它是函数执行的最小时间间隔。您可以阅读有关 setTimeout
here 的更多信息。
关于javascript - 为什么功能会按顺序运行,即使它们是在循环内异步调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54476377/