2011-06-27 9 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

関連する問題