循环中的nodejs请求

时间:2016-09-24 16:55:37

标签: node.js loops request

我正在构建一个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}); 

        }  

        });
    });
});

我这里有两个问题。

  1. 我的循环运行4次,当我尝试console.log()时,i var在控制台中显示4次​​。

  2. 为什么我不能在循环之外使用请求体我做了一些解决方法并在if语句中做了res.render。

1 个答案:

答案 0 :(得分:0)

您可能希望使用asyncjs eachSeries功能,但需要安装(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}); 
    });
});