2016-02-22 2 views
0

Я использую 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 ... The коде как это будет в err, фактический результирующий массив (res_tags).

Может кто-нибудь дать мне руку?

ответ

1

Вы не обрабатывает обратные вызовы надлежащим образом. async использует обратные вызовы с ошибками. Это важная концепция в Node.js, потому что это считается «лучшей практикой» для обработки ошибок в цепочке обратного вызова.

See this post по ошибкам первого обратных вызовов и Node.js

Смотрите ниже, как правильно выполнять обратные вызовы в пределах кода:

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 
}); 
+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

Нет забот, стоит отметить, что @peteb комментарий будет более полный пример, чтобы следовать, поскольку в настоящее время вы не будете ловить никаких ошибок из функции базы данных findOneAndUpdate. –

+0

Да, поскольку @peteb отправил свой ответ, я точно понял, что я делаю неправильно! Но спасибо за ваш ответ, а :) –

Смежные вопросы