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');