2014-01-28 38 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