0

問題が発生しましたが、それを修正するための手順がわかりません。現在、すべてのデータが正しく取得されていますが、responseCallback が起動していないため、応答配列を使用して res.json 呼び出しに到達していません。ここでのガイダンスは大歓迎です!ありがとう。

明確にするために、問題は aysnc.each コールバックにあります。

  var updatedBusinesses = [];
  googleplaces.radarSearch({location:"lat,long",radius:"10000",keyword:"keywordhere"},function(err,response){
   if(err){return next(err);}

   async.each(response.results,function(currResponse,responseCallback){
    Business.findOne({"placesId":currResponse.place_id,"claimed":true}).populate({path:'services',select:''}).exec(function(err,business){
     if(err){return next(err);}

     if(business !== null){
       Service.populate(business.services,{path:'employees',select:'_id appointments firstName lastName username avatarVersion'},function(err,newBusiness){
        if(err){return next(err);}

        googleplaces.placeDetailsRequest({placeid:business.placesId},function(error,placesResult){
         if(error){return responseCallback(error);}

         console.log("RESULT OF THE GOOGLE PLACES DETAIL SEARCH")
         placesResult.result.info = business;
         updatedBusinesses.push(placesResult.result);
         // Here the data is populated and correct.
         // console.log(updatedBusinesses)
         responseCallback();

       });
     })
   }
 })
},function(err){
   if(err){return next(err);}
   console.log("called")
   res.json(updatedBusinesses);
 })
})

これは、更新されたビジネス情報をクライアントに返すことを望んでいる場所ですが、これは決して発火しません。

},function(err){
   if(err){return next(err);}
   console.log("called")
   res.json(updatedBusinesses);
 })
})
4

2 に答える 2

1

async.each() は、反復ごとにコールバック (responseCallback) が呼び出されることを想定しています。呼び出されない場合は、そこに座って待機しています。そのため、更新ビジネス セクションが呼び出されることはありません。

async.each() 内には、async.each() の反復のコールバック (responseCallback) ではない next() を呼び出す場所がいくつかあります。コールバックを適切に呼び出す改訂されたコードは次のとおりです。

var updatedBusinesses = [];

googleplaces.radarSearch({location:"lat,long",radius:"10000",keyword:"keywordhere"},function(err,response){
    if(err){return next(err);}

    async.each(response.results,function(currResponse,responseCallback){
        Business.findOne({"placesId":currResponse.place_id,"claimed":true}).populate({path:'services',select:''}).exec(function(err,business){
            if(err){
              return responseCallback(err);// <== calling responseCallback instead of next() 
            } 

            // in case of business === null/undefined, I'm not seeing any 
            // callback getting called, it needs to be called inside 
            // async.each() no matter which condition it is
            if (!business) {
               // call responseCallback to continue on with async.each()
                return responseCallback();
            }
            Service.populate(business.services,{path:'employees',select:'_id appointments firstName lastName username avatarVersion'},function(err,newBusiness){
                if(err){
                  return responseCallback(err);// <== calling responseCallback instead of next() 
                }

                googleplaces.placeDetailsRequest({placeid:business.placesId},function(error,placesResult){
                    if(error){return responseCallback(error);}

                    console.log("RESULT OF THE GOOGLE PLACES DETAIL SEARCH")
                    placesResult.result.info = business;
                    updatedBusinesses.push(placesResult.result);
                    // Here the data is populated and correct.
                    // console.log(updatedBusinesses)
                    responseCallback();
                });
            })
        })
    },function(err){
        if(err){return next(err);}
        console.log("called");
        res.json(updatedBusinesses);
    });
}); 

そのため、async.each() 内のすべての条件に対して responseCallback() が呼び出されます。これで、コードの「更新されたビジネス情報」の部分に到達するはずです。

于 2015-08-28T23:15:48.103 に答える