与mongo db的异步瀑布

FRi*_*zal 2 asynchronous mongodb node.js monk

可能只是异步的基本概念.我想检查一下我们如何将数组变量从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
    }
])
Run Code Online (Sandbox Code Playgroud)

chr*_*dam 5

为了让您更好地理解使用异步模块使用多个回调,让我们通过一个示例来说明这一点,您将停止使用回调的多个操作的Node.js来查找父实体,然后找到属于的子实体给父母:

methodA(function(a){
    methodB(function(b){
        methodC(function(c){
            methodD(function(d){
                // Final callback code        
            })
        })
    })
})
Run Code Online (Sandbox Code Playgroud)

使用async模块,您可以使用series方法来解决使用回调来嵌套多个方法的代码,这可能会导致回调地狱:

系列:

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
    }
)
Run Code Online (Sandbox Code Playgroud)

瀑布:

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'    
    }
)
Run Code Online (Sandbox Code Playgroud)

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

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
    }
])
Run Code Online (Sandbox Code Playgroud)