首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使setTimeout与queue.js协同工作

使setTimeout与queue.js协同工作
EN

Stack Overflow用户
提问于 2015-11-08 20:03:04
回答 1查看 49关注 0票数 0

我正在尝试执行一段资源密集型的代码,它在执行时锁定浏览器。作为解决办法,我试图使用mbostock的queue.js库和setTimeout来限制执行,这样用户就不会注意到锁。这些电话必须按特定的顺序进行,但需要有一个呼吸时间(目前我使用的是25‘m)。

我很难搞清楚如何把事情联系在一起。

具体来说,在setTimeout函数作用域中,“param”变量的可用性似乎存在问题。当此代码执行时,param将成为每个迭代的相同实例,而不是预期的不同实例。

代码语言:javascript
复制
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');
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-29 19:25:23

这里的关键是使用bind(),它在整个过程中清理了相当多的代码。另外,一个非常重要的问题是,为了使awaitAll()正确工作,必须调用queue.js库默认传入的回调()函数,以便awaitAll()知道何时完成任务。

代码语言:javascript
复制
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');
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33598413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档