【问题标题】:NodeJS async callback. How to return the list, from a async callback?NodeJS 异步回调。如何从异步回调中返回列表?
【发布时间】:2014-02-06 04:23:55
【问题描述】:

所以基本上我是在进行数据库查询,以获取具有特定 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;
    };

【问题讨论】:

    标签: javascript node.js mongodb asynchronous express


    【解决方案1】:

    ALL 回调是异步的,因此我们无法保证它们是否会完全按照我们离开它们的顺序运行。

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

    • 首先:将所有进程放入嵌套列表中:

    而不是这个:

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

    上面的最后一个 sn-p 向我们保证 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...
        }
    );
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如何防止在回调完成之前返回?

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

        相反,提供一个 callback 用于当它被填满时。或者为列表返回一个 Promise。示例:

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

        【讨论】:

        • 我不确定,你的意思。感谢您的帮助!
        • 你不明白什么?
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-05-15
          • 2018-06-14
          • 2014-10-29
          • 2017-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多