async.parrallel不允许首先完成findepisodecount函数

时间:2017-08-01 19:02:21

标签: node.js async.js

**我想首先从findepisodecount函数得到结果然后发送响应但它在从函数获得响应之前发送响应。我正在做什么或者我需要使用其他东西以便代码可以完美地工作 **

  async.parallel([
    /*
     * First external endpoint
     */
    function(callback) {
         Title.title.find({ "primaryTitle" : { $regex:  /Dallas$/ } }).limit(10).lean()
                        .exec(function(err, docs) {
                           // var document= docs.json();

                           var document=  docs;
                         for (var i = 0, len = document.length; i < len; i++) 
                            {
                              //  console.log(docs[i].tconst);
                              if(document[i].titleType!="tvSeries")
                                {
                                            // console.log(docs[i].titleType);
                                }
                              else
                                {
                                    console.log("tv series");
                                    var valueofi = i ;
                                    Title.findepisodecount(document[valueofi],function(fulldocument)
                                    {
                                             document[valueofi].season = fulldocument;
                                           console.log("cacA");

                                              //outercallback();

                                    });
                                //       console.log(i)
                                }
                            }  
                              console.log("helloo");
                              callback(false,  document);    

      });
    }
  ],
  /*
   * Collate results
   */
  function(err, results) {
    if(err) { console.log(err); res.send(500,"Server Error"); return; }
    console.log(results);
    res.send(results);
    //res.send({api1:results[0], api2:results[1]});
  }
  );

1 个答案:

答案 0 :(得分:0)

除非您有更多代码,否则我认为async.waterfall()将是您正在做的更好的用例。原因是你首先要获得标题,然后转换每个标题以包括他们每个人的季节/剧集数。

我们还使用async.mapSeries转换每个标题以包含其季节。

async.waterfall([
    function findTitles(callback) {
        Title.title
            .find({ "primaryTitle" : { $regex:  /Dallas$/ }})
            .limit(10)
            .lean()
            .exec(callback);
    },
    function findSeason(titles, callback) {

        // you are iterating over the documents and doing an async operation to convert each title document, use #async.mapSeries() 

        async.mapSeries(titles, function (title, callback) {
            // note the scope of the argument callback: this inner callback is NOT the same as outer callback

            // do nothing and skip
            if (title.titleType != "tvSeries")
                return callback(null, title);

            // otherwise
            Title.findepisodecount(title, function (season) {
                title.season = season;
                callback(null, title);
            });

        // when the iteration is all done, call the outer callback
        }, callback);


    }
], function (err, titles) {
    console.log('err', err);
    if (err)
        return res.send(500, "Server Error");
    console.log('results', titles);
    res.send(titles);
});

此外,对于将同步for与异步操作混合使用时,这是一个很好的read