2015-11-08 29 views
0

我試圖執行一段代碼,它是資源密集型的,它在執行時鎖定瀏覽器。作爲一種解決方法,我正在嘗試將mbostock的queue.js庫與setTimeout結合使用來對執行進行速率限制,以防止用戶注意到鎖定。呼叫必須按照特定的順序進行,但需要在兩者之間有一段呼吸時間(目前我正在使用25毫秒)。setTimeout使用queue.js

我無法弄清楚如何將事物連接在一起。

具體來說,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'); 
}); 

回答

0

這裏的關鍵是使用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'); 
});