【问题标题】:Async waterfall with mongo db使用 mongodb 的异步瀑布
【发布时间】:2016-01-20 01:29:42
【问题描述】:

可能只是异步的一个基本概念。我想检查一下我们如何将数组变量从 mongo result(docs) 传递给第二个函数。在下面的代码中,第二个 console.log 没有给出任何输出。

// Retrieve
var db = require('monk')('localhost/db');
var async = require('async');

console.log('start');

async.waterfall([

    function(callback) {
        var test = db.get('test');
        test.find({}, function(err, docs) {
            console.log(docs);  //OUTPUT OK
            callback(docs);  

        });

    },
    function(docs, callback) {
        console.log(docs);  //NO OUTPUT
    }
])

【问题讨论】:

    标签: node.js mongodb asynchronous monk


    【解决方案1】:

    为了让您更好地理解在 async 模块中使用多个回调,让我们通过一个来自 Seven Things You Should Stop Doing with Node.js 中的多个回调操作的示例来说明这一点找到父实体,然后找到属于父实体的子实体:

    methodA(function(a){
        methodB(function(b){
            methodC(function(c){
                methodD(function(d){
                    // Final callback code        
                })
            })
        })
    })
    

    使用异步模块,您可以使用系列方法来解决使用回调来嵌套多个方法的代码,这可能会导致Callback Hell:

    系列:

    async.series([
        function(callback){
            // code a
            callback(null, 'a')
        },
        function(callback){
            // code b
            callback(null, 'b')
        },
        function(callback){
            // code c
            callback(null, 'c')
        },
        function(callback){
            // code d
            callback(null, 'd')
        }],
        // optional callback
        function(err, results){
            // results is ['a', 'b', 'c', 'd']
            // final callback code
        }
    )
    

    或者瀑布:

    async.waterfall([
        function(callback){
            // code a
            callback(null, 'a', 'b')
        },
        function(arg1, arg2, callback){
            // arg1 is equals 'a' and arg2 is 'b'
            // Code c
            callback(null, 'c')
        },
        function(arg1, callback){      
            // arg1 is 'c'
            // code d
            callback(null, 'd');
        }], function (err, result) {
            // result is 'd'    
        }
    )
    

    现在回到您的示例,使用异步瀑布方法,您可以将代码重构为

    async.waterfall([
        function(callback) {
            // code a
            var test = db.get('test');
            test.find({}, function(err, docs) {
                if(err) callback(err);
    
                console.log(docs);  // OUTPUT OK
                callback(null, docs);                                    
            });
        }], function(err, result) {
            if(err) callback(err);
            console.log(result);  // OUTPUT OK
        }
    ])
    

    【讨论】:

      【解决方案2】:

      您必须始终处理您的错误。试试这个!

      // Retrieve
      var db = require('monk')('localhost/db');
      var async = require('async');
      
      console.log('start');
      
      async.waterfall([
      
          function(callback) {
              var test = db.get('test');
              test.find({}, function(err, docs) {
                  if(err){
                      console.log(err);
                      callback(err);
                  }
                  else if(docs){
                      console.log(docs);
                      callback(null,docs);
                  }
                  else{
                      console.log("No error no docs");
                      callback(null);
                  }
      
              });
      
          },
          function(err, docs) {
              if(err)
                 console.log(err);
              else{
                 console.log(docs);
              }
          }
      ])
      

      【讨论】:

        猜你喜欢
        • 2014-10-31
        • 2015-07-18
        • 2018-11-13
        • 2020-09-06
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 2014-10-09
        相关资源
        最近更新 更多