2

おそらく、非同期の基本的な概念にすぎません。mongo result(docs) から 2 番目の関数に配列変数を渡す方法を確認したいと思います。以下のコードでは、2 番目の 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
    }
])
4

2 に答える 2

5

asyncモジュールで複数のコールバックを使用することについて理解を深めるために、コールバックを使用した複数の操作のNode.js でやるべきことをやめるべき 7 つのことの例を使用してこれを説明し、親エンティティを見つけてから、属する子エンティティを見つけます。親に:

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

async モジュールを使用すると、 series メソッドを使用して、 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
    }
])
于 2015-10-21T07:14:41.370 に答える
1

常にエラーを処理する必要があります。これを試して!

// 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);
        }
    }
])
于 2015-10-21T06:58:27.983 に答える