2011-06-27 57 views
4

我必須將一組函數傳遞給node.js的async.js模塊。
從文檔以正常的方式將是:將函數數組傳遞給異步並行

async.parallel([ 
    function(callback){ 
     setTimeout(function(){ 
      callback(null, 'one'); 
     }, 200); 
    }, 
    function(callback){ 
     setTimeout(function(){ 
      callback(null, 'two'); 
     }, 100); 
    }, 
], 
// optional callback 
function(err, results){ 
}); 

我想這樣的:

  for(var i = 0; i < jsonData.length; i++) 
      { 
       ... 
       o.url = serviceurl; 
       o.title = jsonData[i]; 
       var ff = function(callback){ 
        obj.loadService(o.title,o.url,callback); 
       } 
       callItems.push(ff(function(){return true;})); 
      } 

      async.parallel(
      callItems, 
       // optional callback 
       function(err, results){ 
        console.log('all calls called without any errors'); 
       }); 

貫穿始終,但主被叫回調心不是。
所以我不能說如果所有的並行調用完成。

我在這裏失蹤了什麼?

回答

5

看起來封閉在for循環中形成不正確。嘗試一個外部函數,返回當前分配給ff的值。例如:

for(var i = 0; i < jsonData.length; i++) 
{ 
    ... 
    o.url = serviceurl; 
    o.title = jsonData[i]; 
    var ff = makeCallbackFunc(obj, o.title, o.url); 
    callItems.push(ff(function() {return true;})); 
} 

function makeCallbackFunc(obj, title, url) { 
    return function (callback) { 
     obj.loadService(title, url, callback); 
    }; 
} 

我是有點要添加到callitems什麼困惑 - 與調用該函數的參數FF的即結果 - 它不會是一個回調,它將執行的時候了。

+0

謝謝,我試過你了,謝謝你最後一句話,我修改它就像:'callItems.push(makeCallbackFunc(obj,o.title,o.url));'這似乎工作。但現在我有這樣的印象,功能不叫平行? – ivoba

+0

他們是平行的,這只是由於其他一些事情 – ivoba