javascript - 为什么功能会按顺序运行,即使它们是在循环内异步调用的?

标签 javascript loops asynchronous closures settimeout

我正在创建一个包装函数,它将采用函数数组并以并行方式执行每个函数,因此考虑使用 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/

相关文章:

python-3.x - 无法连接到docker容器内的postgres数据库

javascript - 范围编译后如何运行 Controller 代码

javascript - 什么是 HTML DOM #text 元素?

javascript - 当 Jquery 的 close() 找不到元素时,我的应用程序会变慢,我该如何执行相同的查询但速度更快?

javascript - 如何检查 Handlebars 中的对象是否为空if语句?

java - 我的 java for 循环跳过了一个步骤

javascript - 应用程序脚本 OK_CANCEL 按钮

javascript - 在数据变化时使用 Angular 动画集合的第一个元素

c - 在允许输入之前循环在输入后运行多次

asynchronous - TypeScript/Angular 2 - 在另一个完成后调用一个函数