我有一个小的FTP脚本,它基本上将整个目录树(通过fs.readdir
行走)一次一个文件传输到FTP服务器(我必须对每个文件进行一些分析,因为它上传了一次一个的行为)。
但是,执行单个文件的位(对于使用c.mkdir
而不是c.put
的目录,还有另一位)如下所示:
console.log('Transferring [' + ival + ']');
var c = new Ftp();
c.on('ready', function() {
c.put(ival, ival, function(err) {
console.log(err);
});
c.end();
});
正如您所看到的,它使用一种非常简单的登录方法,即故障只是被发送到控制台。
不幸的是,由于FTP是异步完成的,因此错误将以与文件名输出完全无关的顺序传递到控制台。
有没有办法强制FTP同步完成,以便错误会立即跟随文件名?基本上,我希望在转到下一个文件之前完成从初始console.log
到最终});
的整个序列。
答案 0 :(得分:4)
即使有,也不建议使用。您通常不希望使用如此长的同步操作来阻止事件循环。
使用递归或Promises确保事情按序列发生可能更有用。
示例:
let ivals = [/* lots of ivals here */];
function putItems(ivals) {
let ival = ivals[0];
console.log('Transferring [' + ival + ']');
var c = new Ftp();
c.on('ready', function() {
c.put(ival, ival, function(err) {
console.log(err);
c.end();
// Don't continue if we're out of items.
if (ivals.length === 1) { return; }
putItems(ivals.slice(1)); // Call again with the rest of the items.
});
});
}
putItems(ivals);
通过使用嵌套函数和单个FTP上下文,可以更智能地完成它。但你明白了。
答案 1 :(得分:3)
如果不同步,您只需记录带错误的名称即可解决错误记录问题。你可以将它包装在一个闭包中,这样你就可以跟踪出现特定错误的ival
:
(function(ival) {
console.log('Transferring [' + ival + ']');
var c = new Ftp();
c.on('ready', function() {
c.put(ival, ival, function(err) {
console.log('[' + ival + ']', err);
});
c.end();
});
})(ival);
答案 2 :(得分:-1)
为什么不把错误推送到数组,当所有上传完成后,你将拥有该数组 所有这些错误按顺序排列?
我会做这样的事情:
var errArray = [];
console.log('Transferring [' + ival + ']');
var c = new Ftp();
c.on('ready', function() {
c.put(ival, ival, function(err) {
errArray.push( err );
});
c.end();
});
c.on('end', function() {
errArray.forEach( function( err ){
console.log( err );
})
});