async each 中的异步任务:在所有任务和子任务完成后回调为 运行
async tasks inside async each : Callback to be run after all task and sub tasks completed
为此,我正在使用 async.js。我基本上迭代所有数组和 运行 使用 aysnc.each 删除。
var async = require("async");
var fs = require('fs');
var files = ['a.log', 'b.log', 'c.log'];
async.each(files, function(file, cb) {
if(file == 'a.log') {
console.log('its A');
fs.unlink(file, function(err) { //delete the particular file
if(err) {
console.error(err);
}
console.log(file + ' has been Deleted');
});
}
if(file == 'b.log') {
console.log('its B');
fs.unlink(file, function(err) {
if(err) {
console.error(err);
}
console.log(file + ' has been Deleted');
});
}
if(file == 'c.log') {
console.log('its C');
fs.unlink(file, function(err) {
if(err) {
console.error(err);
}
console.log(file + ' has been Deleted');
});
}
cb();
}, function(err) {
console.log('all done');
});
我现在的输出..删除稍后完成。
its A
its B
its C
all done
a.log has been Deleted
b.log has been Deleted
c.log has been Deleted
我想要实现的是输出类似于下面的内容,其中回调只会 运行 在所有每个子任务(删除文件)完成后。
its A
its B
its C
a.log has been Deleted
b.log has been Deleted
c.log has been Deleted
all done //would like this
您的迭代对象的回调被调用得太早(它没有等待 fs.unlink
完成)。
您需要在 fs.unlink
回调中移动对它的调用:
async.each(files, function(file, cb) {
if(file == 'a.log') {
...
} else if(file == 'b.log') {
...
} else if(file == 'c.log') {
...
}
...
fs.unlink(file, function(err) {
...
cb();
...
}
...
}, function(err) {
console.log('all done');
});
var async = require("async");
var fs = require('fs');
var files = ['a.log', 'b.log', 'c.log'];
var dict = { 'a.log': 'A', 'b.log': 'B', 'c.log': 'C' };
async.each(files, function(file, cb) {
console.log('its ' + dict[file]);
fs.unlink(file, function(err) {
if(err) {
console.error(err)
cb(err)
} else {
console.log(file + ' has been Deleted');
cb()
}
})
}, function(err) {
console.log('all done');
});
您应该将回调调用移到取消链接函数中。
我也删除了冗余代码。
下一步试试
var async = require("async");
var fs = require('fs');
var files = ['a.log', 'b.log', 'c.log'];
async.each(files, function (file, cb) {
console.log(file);
fs.unlinkSync(file); //delete the particular file
console.log(file + ' has been Deleted');
cb();
}, function (err) {
console.log('error = ', err);
}
);
console.log('All done');
为此,我正在使用 async.js。我基本上迭代所有数组和 运行 使用 aysnc.each 删除。
var async = require("async");
var fs = require('fs');
var files = ['a.log', 'b.log', 'c.log'];
async.each(files, function(file, cb) {
if(file == 'a.log') {
console.log('its A');
fs.unlink(file, function(err) { //delete the particular file
if(err) {
console.error(err);
}
console.log(file + ' has been Deleted');
});
}
if(file == 'b.log') {
console.log('its B');
fs.unlink(file, function(err) {
if(err) {
console.error(err);
}
console.log(file + ' has been Deleted');
});
}
if(file == 'c.log') {
console.log('its C');
fs.unlink(file, function(err) {
if(err) {
console.error(err);
}
console.log(file + ' has been Deleted');
});
}
cb();
}, function(err) {
console.log('all done');
});
我现在的输出..删除稍后完成。
its A
its B
its C
all done
a.log has been Deleted
b.log has been Deleted
c.log has been Deleted
我想要实现的是输出类似于下面的内容,其中回调只会 运行 在所有每个子任务(删除文件)完成后。
its A
its B
its C
a.log has been Deleted
b.log has been Deleted
c.log has been Deleted
all done //would like this
您的迭代对象的回调被调用得太早(它没有等待 fs.unlink
完成)。
您需要在 fs.unlink
回调中移动对它的调用:
async.each(files, function(file, cb) {
if(file == 'a.log') {
...
} else if(file == 'b.log') {
...
} else if(file == 'c.log') {
...
}
...
fs.unlink(file, function(err) {
...
cb();
...
}
...
}, function(err) {
console.log('all done');
});
var async = require("async");
var fs = require('fs');
var files = ['a.log', 'b.log', 'c.log'];
var dict = { 'a.log': 'A', 'b.log': 'B', 'c.log': 'C' };
async.each(files, function(file, cb) {
console.log('its ' + dict[file]);
fs.unlink(file, function(err) {
if(err) {
console.error(err)
cb(err)
} else {
console.log(file + ' has been Deleted');
cb()
}
})
}, function(err) {
console.log('all done');
});
您应该将回调调用移到取消链接函数中。 我也删除了冗余代码。
下一步试试
var async = require("async");
var fs = require('fs');
var files = ['a.log', 'b.log', 'c.log'];
async.each(files, function (file, cb) {
console.log(file);
fs.unlinkSync(file); //delete the particular file
console.log(file + ' has been Deleted');
cb();
}, function (err) {
console.log('error = ', err);
}
);
console.log('All done');