Async库中的回调错误

时间:2016-02-22 16:22:39

标签: node.js asynchronous mongoose

我将async库与猫鼬一起使用如下:

async.waterfall([
  function(callback) {
    async.map(new_tags, function(tag, callback) {
      Tag.findOneAndUpdate(
        { '_id': tag._id },
        { '$setOnInsert': { '_id': tag._id, 'name': tag.name } },
        { 'upsert': true, 'new': true },
        callback
      );
    }, callback);
  }, function(tags, callback) { 
    for(var k = 0; k < tags.length; k++) {
      res_tags.push(tags[k]._id);
    }
    callback(res_tags);
  }
],
function(err, results) {
  callback(err, results);
});

但是我对如何在async.waterfall结束时捕获错误表示怀疑......代码与err中的代码一样,实际结果数组({{ 1}})。

有人可以帮我一把吗?

2 个答案:

答案 0 :(得分:1)

瀑布中每个函数回调的第一个参数应该是一个Error对象,如果没有错误,则为null。

callback(res_tags);

应改为:

callback(null, res_tags);

从文档(https://github.com/caolan/async#waterfall):

async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
        // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
    // result now equals 'done'
});

答案 1 :(得分:1)

您没有正确处理回调。 async使用错误优先回调。这是Node.js中的一个重要概念,因为这被认为是处理回调链中错误的“最佳实践”。

错误优先回调和Node.js

See this post

请参阅下文,了解如何在代码中正确实现回调:

async.waterfall([
  function(callback) {
    var res
    async.map(new_tags, function(tag, callback) {
      Tag.findOneAndUpdate(
        { '_id': tag._id },
        { '$setOnInsert': { '_id': tag._id, 'name': tag.name } },
        { 'upsert': true, 'new': true },
        function (err, doc) {
          // If an error occurs, pass it back to our map callback.
          if (err) 
            return callback(err, null); 

          // If there was no error return the doc
          return callback(null, doc);
        }
      );
    }, function (err, docs) {
      // If an error occurred during map return it back to the waterfall
      if (err)
        return callback(err, null);

      // Return back all docs
      return callback(null, docs);
    });
  }, function(tags, callback) { 
    // For each tag push them to res_tags
    async.each(tags, function(tag) {
      res_tags.push(tags[k]._id);
    }, function(err) {
      if (err)
        return callback(err, null);

      return callback(null, res_tags);
    }); 
  }
],
function(err, results) {
  // If an error happened during any execution in waterfall catch it and handle it
  if (err)
    // Error handling 
  else
    return results; // No error, return our results
});