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();
});
});
我正在 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();
});
});