2016-09-24 7 views
0

私はnodejsアプリケーションを構築しています。ループ内のnodejs要求

Location.find({} ,function (err, result){ 
    var locations = []; 
    result.forEach(function(listItem, i){ 
    url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + encodeURIComponent(listItem.address) + "&key=AIzaSyDQsX4Kci3xHp1xy6ZjT-5lsLNI-J-CH-8"; 
     request(url, function(error, response, body) { 

     all = JSON.parse(body); 


     locations.push({des: result[i].placeinfo,lat: all.results[0].geometry.location.lat, lng: all.results[0].geometry.location.lng }); 

     if (i == result.length - 1) {  
     res.render("index.ejs", { layout: false,locationmap:locations}); 

     } 

     }); 
    }); 
}); 

ここには2つの問題があります。

  1. 私のループはconsole.log()にしようとすると4回実行され、コンソールではそのvarが4回表示されます。

  2. なぜ私はいくつかの回避策を行い、if文の中でres.renderを行ったリクエスト本体をループ外で使用します。

答えて

0

あなたはasyncjseachSeries機能を使用したいかもしれませんが、あなたは(npm install asyncjs --save)をインストールしてから

var async = require('asyncjs'); 

Location.find({} ,function (err, result){ 
    var locations = []; 
    async.eachSeries(result, function iteratee(listItem, callback) { 
     url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + encodeURIComponent(listItem.address) + "&key=AIzaSyDQsX4Kci3xHp1xy6ZjT-5lsLNI-J-CH-8"; 
     request(url, function(error, response, body) { 
      all = JSON.parse(body); 
      locations.push({des: result[i].placeinfo,lat: all.results[0].geometry.location.lat, lng: all.results[0].geometry.location.lng }); 
      callback(error, body); 
     }); 
    }, function done() { 
     res.render("index.ejs", { layout: false,locationmap:locations}); 
    }); 
}); 
のように使用する必要があります
関連する問題