2013-02-05 23 views
1

我有一個問題想出如何使用不同參數的函數數組。我正在使用coffeescript和async,但我認爲這是一個問題與我的理解的JavaScript。Async.parallel與任務數組

我想用不同的任務創建一個函數數組。

names = ['Jeff', 'Maria', 'Steve'] 
tasks = [] 

for name in names 
    tasks.push (callback)=> 
     @controller.get_person name, (person) => 
     callback(null, person) 

async.parallel(tasks, cb) 

問題是,任務與史蒂夫(總是最後一個在數組中)三次調用。我如何做到這一點,以便每個名稱都有一項任務?

+0

可能重複[Javascript閉合內部循環 - 簡單實用示例](http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Bergi

+0

可能重複[閉合範圍沒有被捕獲? - Coffeescript](http://stackoverflow.com/questions/11996218/closure-scope-not-captured-coffeescript) –

+0

@Bergi提供了一個通用的JavaScript解決方案,也將適用於CoffeeScript,我的重複包括CoffeeScript特定的'do '關鍵字。拿你的選擇。 –

回答

1

事實上,在這種特殊情況下,你應該使用異步的map的:

getPerson = (name, callback) => 
    @controller.get_person name, (person) -> 
    callback(null, person) 

async.map names, getPerson, (err, persons) -> 
    // Do stuff with persons 

請注意,如果您@controller.get_person方法,隨後傳遞任何錯誤作爲第一個參數的節點做法回調,這就足夠了:

async.map names, @controller.get_person, (err, persons) -> 
    // Do stuff with persons 

有些事情要記住,也許。

+0

很好!謝謝。第一種方式工作得很好。第二種方式看起來很棒。但是,在第二種方式中,'@ controller'似乎不會傳遞給'map'函數。我的意思是,@似乎反彈並且失去了對「控制器」的引用。有沒有辦法來解決這個問題? – Alexis

+0

@Scoop:是的,你需要用胖箭頭('=>')聲明'get_person',所以它總是綁定到對象(在任何'@ controller'的類定義中)。 –

1

嘗試更改for name in namesnames.forEach (name)=>forEach之後請注意空間。

names = ['Jeff', 'Maria', 'Steve'] 
tasks = [] 

names.forEach (name)=> 
    tasks.push (callback)=> 
     @controller.get_person name, (person) => 
     callback(null, person) 

async.parallel(tasks, cb)