使 setTimeout 与 queue.js 一起工作
making setTimeout work with queue.js
我正在尝试执行一段资源密集型代码,以至于它在执行时会锁定浏览器。作为一种解决方法,我正在尝试将 mbostock 的 queue.js 库与 setTimeout 结合使用来限制执行速度,以便用户不会注意到锁定。调用必须按特定顺序进行,但之间需要有一个呼吸周期(目前我使用的是 25 毫秒)。
我无法弄清楚如何 link 把事情放在一起。
具体而言,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');
});
这里的关键是使用 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');
});
我正在尝试执行一段资源密集型代码,以至于它在执行时会锁定浏览器。作为一种解决方法,我正在尝试将 mbostock 的 queue.js 库与 setTimeout 结合使用来限制执行速度,以便用户不会注意到锁定。调用必须按特定顺序进行,但之间需要有一个呼吸周期(目前我使用的是 25 毫秒)。
我无法弄清楚如何 link 把事情放在一起。
具体而言,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');
});
这里的关键是使用 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');
});