2012-09-09 49 views
0

我正在使用parallel function in Async.js,由於某種原因,最終回調沒有執行,我也沒有看到任何地方發生錯誤。Async.js並行回調未執行

我動態創建的被傳遞給平行呼叫作爲這樣的功能的數組:

// 'theFiles' is an array of files I'm working with in a code-generator style type of scenario 
var callItems = []; 
theFiles.forEach(function(currentFile) { 

     var genFileFunc = generateFileFunc(destDir + "/" + currentFile, packageName, appName); 

     callItems.push(genFileFunc(function(err, results) { 
     if(err) { 
      console.error("*** ERROR ***" + err); 
     } else { 
      console.log("Done: " + results); 
     } 

     })); 

    }); 

    async.parallel(callItems, function(err, results) { 
     console.log(err); 
     console.log(results); 
     if(err) { 
     console.error("**** ERROR ****"); 
     } else { 
     console.log("***** ALL ITEMS HAVE BEEN CALLED WITHOUT ERROR ****"); 
     } 
    }); 

然後,在外部功能(外正在執行上述在Foreach功能的)我有generateFileFunc()函數。

// Function that returns a function that works with a file (modifies it/etc). 
function generateFileFunc(file, packageName, appName) { 
    return function(callback) { 
    generateFile(file, packageName, appName, callback); 
    } 
} 

我已經看了this SO post和它幫助我得到我在哪裏。但是最後的回調沒有被執行。並行調用中的所有項目正在執行。在最底層的gnerateFile(函數)內部,我稱之爲回調函數,所以這就是黃金。

任何人都有任何想法,爲什麼這可能無法正確執行?

最終結果是並行處理每個函數調用,然後在完成後通知我可以繼續執行一些其他指令。

謝謝!

回答

3

分析什麼是逐行發生,首先是這樣的:

var genFileFunc = generateFileFunc(...); 

因爲你的函數generateFileFunc返回功能,所以變量genFileFunc是下面的函數

genFileFunc === function(callback) { 
    generateFile(...); 
}; 

現在很明顯,這函數返回什麼也沒有(沒有return聲明)。而且明顯通過沒有什麼我瞭解JavaScript的內置undefined常量。特別是你有

genFileFunc(function(err, results) { ... }) === undefined 

這是調用它的結果。因此,您將undefined推至callItems。難怪它不起作用。

很難說如何解決這個問題,而不知道generateFile究竟是什麼,但我會試試它。嘗試簡單地這樣做:

callItems.push(genFileFunc); 

,因爲你要推功能callItems的功能,這是undefined沒有結果。

+0

你釘了它。出於某種原因,我一直告訴自己,我正在generateFileFunc調用中返回一個函數。但是,正如你所說的,在數組推送上,我正在執行方法而不是將函數作爲參數傳遞。很好的解釋。 –

2

好奇。

迄今爲止的猜測:在generateFile裏面,RETURN回調而不是調用它。

+0

喬什既定目標 - 你是對的。然而,直到我按照奇怪的邏輯發佈,它才點擊。儘管如此,仍然贊成你。謝謝! –

1

可以實現與

async.map(theFiles, function(file, done) { 
    generateFile(destDir + "/" + file, packageName, appName, done); 
}, function(err, res) { 
    // do something with the error/results 
});