ftp 异步客户端 javascript

ftp client with async javascript

我正在 node.js 中编写并使用 async.js 和 ftp 客户端模块。
我正在使用 async.series,这是 async.series:

中的一个函数
    var client = new ftp();
client.on('ready', function () {
    for ( var i = 0  ; i < stage._sub_directories.length ; i++ ) {
        var path = get_absolute_path() + DIRECTORY_NAME_LESSONS + stage._name + "/" + DIRECTORY_NAME_STAGE + stage._sub_directories[i];
        var file = 'copy.' + stage._sub_directories[i] + get_xml_file_name();
        client.get(path + "/" + get_xml_file_name(), function (err, stream) {
            console.log('done');
            if (err) throw err;
            stream.once('close', function () {client.end();});
            stream.pipe(fs.createWriteStream(file));
            callback(null, true);
        });
    }
});
client.connect(config);

callback(null, true); 用于异步模块。 当它是 运行 时,它插入 for 循环 stage._sub_directories.length 次,而 然后 只插入到 client.get() 一次(最后一次) .
它创建了一个文件,而不是更多。
我的问题是什么?我应该使用另一个异步控制流吗?或者是其他东西?

您的代码编写方式无法正常工作,因为您在常规循环中调用异步函数 client.get

您应该将常规 for 循环替换为 async.eachSeries 方法,因为您已经在使用 async.js。试试这个:

client.on('ready', function () {
    async.eachSeries(stage._sub_directories, function (subDir, done) {
        var path = get_absolute_path() + DIRECTORY_NAME_LESSONS + stage._name + "/" + DIRECTORY_NAME_STAGE + subDir;
        var file = 'copy.' + subDir + get_xml_file_name();
        client.get(path + "/" + get_xml_file_name(), function (err, stream) {
            if (err) return done(err);
            console.log('done');
            stream.once('close', function () {client.end();});
            stream.pipe(fs.createWriteStream(file));
            done();
        });
    }, function (err) {
        if (err) return callback(err);
        callback(null, true);
    });
});

"workaround" 这些当前流行的 FTP 模块需要多少标记和发现,这真是令人沮丧...我是 FTPimp 的作者,我专门写了它来解决这个问题这种挫败感。 例如,您可以仅使用 ftpimp 模块来做同样的事情:

ftp.connect(function () {
    stage._sub_directories.forEach(function (subDir) {
        var path = get_absolute_path() + DIRECTORY_NAME_LESSONS + stage._name + "/" + DIRECTORY_NAME_STAGE + subDir;
        var file = 'copy.' + subDir + get_xml_file_name();
        //save from -> to
        ftp.save([path + "/" + get_xml_file_name(), file], function (err, name) {
            console.log(err, name);
        });
    });
    //@see http://ftpimp.net/FTP.html#event:queueEmpty
    ftp.once('queueEmpty', function () {
        console.log('files saved');
        //do more stuff ...
        ftp.quit();
    });
});