Javascript 使setTimeout与queue.js一起工作

Javascript 使setTimeout与queue.js一起工作,javascript,queue,settimeout,queue.js,Javascript,Queue,Settimeout,Queue.js,我试图执行一段资源密集型代码,执行时会锁定浏览器。作为一种解决方法,我尝试将mbostock的queue.js库与setTimeout结合使用,以限制执行的速率,这样用户就不会注意到锁定。通话必须按特定顺序进行,但其间需要有一段呼吸时间(目前我使用的是25毫秒) 我搞不清楚如何把事情联系起来 具体来说,setTimeout函数范围内的'param'变量的可用性似乎存在问题。当执行此代码时,param在每次迭代中都是相同的实例,而不是预期的不同实例 var q = queue(1);

我试图执行一段资源密集型代码,执行时会锁定浏览器。作为一种解决方法,我尝试将mbostock的queue.js库与setTimeout结合使用,以限制执行的速率,这样用户就不会注意到锁定。通话必须按特定顺序进行,但其间需要有一段呼吸时间(目前我使用的是25毫秒)

我搞不清楚如何把事情联系起来

具体来说,setTimeout函数范围内的'param'变量的可用性似乎存在问题。当执行此代码时,param在每次迭代中都是相同的实例,而不是预期的不同实例

var q = queue(1);            
var waitParamInits = [];
var keys = Object.keys(attr.customParams);

for (var i=0; i < keys.length; i++) {
    var param = attr.customParams[keys[i]];
    var wait = function(callback) {
        setTimeout(function() {
            if (!param.initializeParm()) {
                handleError('Error initializing parameter: ' + param, false);
            }
        }, 25, param);
    };
    waitParamInits.push(wait);
}

waitParamInits.forEach(function(t) {q.defer(t); });
q.awaitAll(function(error, results) {
    console.log('finished with wait params');
});
var q=queue(1);
var waitParamInits=[];
var keys=Object.keys(attr.customParams);
对于(变量i=0;i
这里的关键是使用bind(),它在过程中对代码进行了大量清理。另外,非常重要的一点是,为了让awaitAll()正常工作,必须调用queue.js库默认传入的callback()函数,以便让awaitAll()知道事情何时完成

var q = queue(1);            
var waitParamInits = [];
var keys = Object.keys(attr.customParams);

for (var i=0; i < keys.length; i++) {
    var param = attr.customParams[keys[i]];
    var wait = function(x, callback) { // add the 'x' var to params - 'callback' must be last!
        return setTimeout(function() { // return the setTimeout function
            // bind(), used below in push(), gives us access to 'x' in this scope
            if (!param[x].initializeParm()) {
                handleError('Error initializing parameter: ' + param, false);
            callback(null, 'done with ' + x); // queue.js REQUIRES that the callback it passes in must execute
            }
        }, 25); // remove the 'param' arg
    };
    waitParamInits.push(wait.bind(this, x)); // use bind() to introduce the correct parameter per iteration of the for loop
}

waitParamInits.forEach(function(t) {q.defer(t); });
q.awaitAll(function(error, results) {
    console.log('finished with wait params');
});
var q=queue(1);
var waitParamInits=[];
var keys=Object.keys(attr.customParams);
对于(变量i=0;i