2014-01-28 39 views
2

我是新來的node.js,也許我做錯了什麼。 這是非常流行的異步遞歸複製實用程序npmjs.org/package/ncp。node.js ncp(異步遞歸拷貝實用程序)回調不叫

我試圖在並行運行它:

var ncp = require('ncp').ncp; 

var dirs = [ 
    ['test/from/1', 'test/to/1'], 
    ['test/from/2', 'test/to/2'], 
    ['test/from/3', 'test/to/3'] 
]; 

var copyDirAsync = function (dir) { 
    ncp(dir[0], dir[1], function (err) { 
     console.log('done: ' + dir[1]); 
    }); 
} 

for (var i = 0; i < dirs.length; ++i) { 
    copyDirAsync(dirs[i]); 
} 

因此,所有迪爾斯複製就好了。但是,我只獲得一個隨機目錄打印的console.log消息。另外兩個沒有到達。該計劃剛剛存在。如果我添加一個15秒的超時,以便節點繼續運行一段時間,則回調也不會到達。我認爲這是ncp的一個問題,但是每天下載30K的1個月大的release 0.5.0,到目前爲止還沒有報道任何問題,加上我是node.js的新手,我只會假設我不明白關於節點的東西。

回答

3

首先閱讀Asynchronous iteration patterns

現在,您可以使用async模塊特別async.series像這樣;

var ncp = require('ncp').ncp 
    , async = require('async'); 

var dirs = [ 
    ['test/from/1', 'test/to/1'], 
    ['test/from/2', 'test/to/2'], 
    ['test/from/3', 'test/to/3'] 
]; 

var copyDirAsync = function (dir, done) { 
    ncp(dir[0], dir[1], function (err) { 
    if (err) return done(err); 
    console.log('done: ' + dir[1]); 
    done(); 
    }); 
} 


async.each(dirs, copyDirAsync, function(err){ 
    console.log(err); 
}); 
+1

我從我的應用程序中減少了我的例子,在async.map()中它使用ncp並行運行。我只是不明白爲什麼它不能平行運行? – srgstm

+0

通過更改爲mapSeries使其工作。仍然並不清楚並行:ncp是一個200-loc函數,封裝爲沒有定義全局變量的閉包。 – srgstm