2016-07-08 8 views
0

私はサードパーティのAPIに複数のリクエストを行い、受信したデータの配列をクライアント。明らかに、サードパーティAPIへのリクエストは非同期であり、リクエストループの直後にres.jsonを置くと、データは空になります。要求を約束で包む必要がありますか?ここに私のコードは次のとおりです。サードパーティのAPIに複数のリクエストを行った後でレスポンスを送信する方法Node.js

const historicalForecast = (req, res, next) => { 
    console.log(req.body); 
    // GET COORDS FROM GOOGLE API BY LOCATION INPUT BY USER 
    let googleUrl = `https://maps.googleapis.com/maps/api/geocode/json?address=${req.body.input}&key=${googleKey}`; 
    request(googleUrl, function(error, response, body){ 
    if(error){ 
     console.log(error); 
     next(); 
    } 
    let data = JSON.parse(response.body); 
    //IF MORE THAN ONE RESULT FROM GEOLOCATION QUERY 
    //ADD DATES REQUESTED INTO RESPONSE AND 
    //SEND LIST OF LOCATIONS BACK SO USER CAN CHOOSE 
    if(data.results.length > 1){ 
     response.body.startDate = req.body.startDate; 
     response.body.endDate = req.body.endDate; 
     res.json(JSON.parse(response.body)); 

    //IF ONE RESULT, GET DATA IN BATCHES 
    }else if(data.results.length === 1) { 
     let coords = data.results[0].geometry.location; 
     const OneDay = 86400; 
     let timeFrame = Math.abs(req.body.startDate - req.body.endDate); 
     let numberOfDays = timeFrame/OneDay; 
     console.log(numberOfDays); 
     let results = []; 

     for(let i = 0; i < numberOfDays; i++){ 
     let currentDay = Number(req.body.startDate) + (i*OneDay); 
     let urlWeather = `https://api.forecast.io/forecast/${weatherKey}/${coords.lat},${coords.lng},${currentDay}`; 
     request(urlWeather, function(error, response, body){ 
      if(error){ 
      console.log(error); 
      next(); 
      } 
      results.push(JSON.parse(response.body)); 
      res.send(results); 
     }); 
     } 
    } 
    }); 
}; 
+2

あなたはrequest' 'のpromisifiedバージョンを使用して、ときにすべてのあなたの要求を知るために' 'Promise.all()を使用することになるでしょう:文がでた場合

は、私は他のすべてのコードを置き換えされます。この質問には何度も尋ねられている可能性が高いので、これを説明する他の多くの答えがあります。 – jfriend00

+1

以下は、複数の非同期操作がいつ行われるかを知るために約束を使用する一般的な構造です:http://stackoverflow.com/questions/32799672/node-js-how-to-set-a-variable-outside-the-current-scope/32799727#32799727 – jfriend00

+0

ありがとうございました。 @ jfriend00 – Atache

答えて

0

私は見ての@ jfriend00の提案を1として:

Node.JS How to set a variable outside the current scope

とが設けられ、多くのオプションのいずれかを使用していました。私の解決策は上記のポストにあります。将来の参照のためにその投稿をブックマークします。

let coords = data.results[0].geometry.location; 
    const OneDay = 86400; 
    let timeFrame = Math.abs(req.body.startDate - req.body.endDate); 
    let numberOfDays = timeFrame/OneDay; 


    const makeMultipleQueries = (url) => { 
    return new Promise(function(resolve, reject) { 
     request(url, function(error, response, body){ 
     if(error){ 
      reject(error); 
     } 
     resolve(response.body); 
     }); 
    }); 
}; 

let promises = []; 
for (let i = 0; i < numberOfDays; i++) { 
    let currentDay = Number(req.body.startDate) + (i*OneDay); 
    let url = `https://api.forecast.io/forecast/${weatherKey}/${coords.lat},${coords.lng},${currentDay}`; 
    promises.push(makeMultipleQueries(url)); 
} 
Promise.all(promises).then(function(results) { 
    res.json(results); 
}, function(err) { 
    next(err); 
}); 
+1

スタックオーバーフローを使用する適切な方法は、答えに実際にコード化された答えを入れ、質問から取り除くことです。いくつかの他のサイトとは異なり、質問は質問のみでなければならず、答えはここでの回答に過ぎないはずです。だから、あなたの解決策をあなたの質問から取り出し、あなたの答えに入れてください。あなたはあなたの質問が今答えられたことをコミュニティに示すために、あなた自身の質問に対する回答を「受け入れる」ことができます(一定の時間が経過すると)。また、あなたの道を示すリンクされた答えをupvoteすることができます。 – jfriend00

関連する問題