2013-11-27 51 views
1

我有兩個單獨的數組需要處理。由於它們不是依賴的,我想這樣做異步。使用async.parallel處理數組

這裏是我的代碼:

cats = ['snowball', 'berlioz', 'garfield', 'lucifer']; 
tigers = ['shere khan', 'hobbes', 'rajah']; 

async.parallel({ 

     cats: async.apply(cats.forEach(function(item){ 

      if(item == 'garfield') 
       console.log('hide your lasagna'); 
      else 
       console.log('all safe'); 

     })), 

     tigers: async.apply(tigers.map(function(item){ 

      if(item == 'hobbes') 
       return 'eats tuna'; 
      else 
       return 'eats people'; 

     })) 

    }, function(error, results){ 

     if(error) 
      console.log(error); return; 

     meals = JSON.parse(results['tigers']); 
     console.log('tiger meals: '+meals); 

}); 

這是錯誤我得到:

TypeError: Cannot call method 'apply' of undefined 

什麼錯?

此外,作爲一個側面問題,我如何在這裏實現async.forEachasync.map

回答

2

您的代碼段中有幾個主要問題。

  • 異步處理異步功能。異步函數不能使用return關鍵字返回值,因爲這是一個同步模式。異步函數必須將回調函數作爲最後一個參數,並在完成時調用它。你的匿名工作者功能都不符合這個。
  • Array.forEach不會返回任何東西,但您正在使用它,就好像它一樣。 async.apply需要一個函數作爲它的第一個參數。

開始一步一步:

寫命名的功能,你想要做什麼異步風格上的一個參數

function shouldWeHideTheLasagna(item, callback) { 
    if (item === 'garfield') { 
    process.nextTick(function() { 
     callback(null, true); 
    }); 
    } else { 
    process.nextTick(function() { 
     callback(null, false); 
    }); 
    } 
} 

瞭解如何直接使用,如果沒有異步。然後結合async.map練習使用,async.map(cats, shouldWeHideTheLasagna, function (error, results) {});然後爲老虎重複一次,希望現在有足夠的燈泡可用,您將準備好嘗試將async.parallel和sub-asyncs結合使用。但這是一件棘手的事情,所以請慢慢一步一步瞭解每一步的工作原理。

+0

這些是一些非常好的指針謝謝你!我現在可以看到我是如何誤認爲「異步」的「多線程」。 – CrackerKraken

0

我認爲你誤解了async的用途。 Async旨在用於已經異步的函數,併爲您的回調提供組織。例如,如果您需要依次調用三個IO事件,則可以使用Async.series來確保每個事件都在先前運行,而無需擔心callback hell

在您的方案中,所有函數都是同步的,因此,異步並不會真正改善您的運行時間。相反,我會推薦使用Array.map和Array.forEach等核心數組原型。