NodeJS异步回调。如何从异步回调中返回列表?

时间:2014-02-06 04:23:56

标签: javascript node.js mongodb asynchronous express

所以基本上我正在进行数据库查询,获取具有特定ID的所有帖子,然后将它们添加到列表中,这样我就可以返回了。但是在回调完成之前返回列表。

如何在回调完成之前阻止它被返回?

 exports.getBlogEntries = function(opid) {
    var list12 =[];   


    Entry.find({'opid' : opid}, function(err, entries) {

            if(!err) {
           console.log("adding");

            entries.forEach( function(currentEntry){


                list12.push(currentEntry);



            });

            }

            else {
                console.log("EEEERROOR");
            }

            //else {console.log("err");}


          });
    console.log(list12);
    return list12;
    };

4 个答案:

答案 0 :(得分:0)

您可以使用同步数据库调用,但这可以解决node.js的概念。

正确的方法是将回调传递给查询数据库的函数,然后在数据库查询回调中调用提供的回调。

答案 1 :(得分:0)

  

如何在回调完成之前阻止它被返回?

回调是异步的,你无法避免。因此,您不能return列表。

相反,在填充时提供回调。或者返回列表的Promise。例如:

exports.getBlogEntries = function(opid, callback) {
    Entry.find({'opid': opid}, callback); // yes, that's it.
                                          // Everything else was boilerplate code
};

答案 2 :(得分:0)

所有回调都是异步的,因此我们无法保证它们是否按照我们保留的顺序运行。

要修复它并使流程“同步”并保证订单执行,您有两个解决方案

  • 首先:在嵌套列表中创建所有进程:

而不是:

MyModel1.find({}, function(err, docsModel1) {
    callback(err, docsModel1);
});

MyModel2.find({}, function(err, docsModel2) {
    callback(err, docsModel2);
});

使用它:

MyModel1.find({}, function(err, docsModel1) {
    MyModel2.find({}, function(err, docsModel2) {
        callback(err, docsModel1, docsModel2);
    });
});

上面的最后一个片段保证我们MyModel2将被执行 AFTER MyModel1

  • 第二:将某个框架用作Async。这个框架非常棒,并且有几个辅助函数可以串行执行代码,并行,无论我们想要什么样的方式。

示例:

async.series(
    {
        function1 : function(callback) {
            //your first code here
            //...
            callback(null, 'some result here');
        },
        function2 : function(callback) {
            //your second code here (called only after the first one)
            callback(null, 'another result here');
        }
    },
    function(err, results) {
        //capture the results from function1 and function2
        //if function1 raise some error, function2 will not be called.

        results.function1; // 'some result here'
        results.function2; // 'another result here'

        //do something else...
    }
);

答案 3 :(得分:0)

有另一种方法可以处理这种情况。您可以使用async模块,当forEach完成后,进行返回调用。请在下面找到相同的代码段:

var async = requires('async');
exports.getBlogEntries = function(opid) {
var list12 =[];
Entry.find({'opid' : opid}, function(err, entries) {
    if(!err) {
       console.log("adding");
       async.forEachSeries(entries,function(entry,returnFunction){
           list12.push(entry);
       },function(){
           console.log(list12);
           return list12;
       });
    }
    else{
            console.log("EEEERROOR");
    }
  });
};