执行多个http请求 - Parse Cloud Code

Execute multiple http request - Parse Cloud Code

我有一个商店数组,其中存储了地址和其他一些东西。

现在我想遍历这个数组并对纬度/经度坐标进行地理编码并将它们保存到数据库中。

使用下面的代码,我获得了同一家商店的两倍或三倍条目。我是否错过了这里的示波器?

谢谢!

var promises = [];

data.forEach(function (element, index) 
{
    var addressString = element.plz + " " + element.stadt + "," + element.adresse;
    var url = encodeURI("https://maps.googleapis.com/maps/api/geocode/json?address=" +
        addressString);
    var promise = Parse.Cloud.httpRequest({
        method: "GET",
        url:url
    }).then(function (http) //SUCCESS
        {
            var geocodedObject = new Parse.Object("GeocodedStores");
            geocodedObject.set("storeID", element.id);
            geocodedObject.set("Latitude", http.data.results[0].geometry.location.lat);
            geocodedObject.set("Longitude", http.data.results[0].geometry.location.lng);

            return geocodedObject.save(null, {
                useMasterKey: true
            });
        },
        function (http, error) 
        {
            response.error(error);
        });
    promises.push(promise);
});

return Parse.Promise.when(promises);

终于找到了可行的解决方案。看起来这是范围的问题。我将代码放在一个单独的函数中,并将这个返回的承诺添加到一个数组中。

var fn = function(element, geocodedObject)
{
    var addressString = element.plz + " " + element.stadt + "," + element.adresse;
    var url = encodeURI("https://maps.googleapis.com/maps/api/geocode/json?address=" +
        addressString);

    Parse.Cloud.httpRequest({
    method: "GET",
    url: url
    }).then(function(http)
    {   

        geocodedObject.set("storeID", element.id);

        geocodedObject.set("Latitude", http.data.results[0].geometry.location.lat);
        geocodedObject.set("Longitude", http.data.results[0].geometry.location.lng);

        geocodedObject.set("address", addressString);

        return geocodedObject.save(null, {
            useMasterKey: true
        });

    });
}

var promises = [];

for (var k = 0;k<data.length;k++) 
{
    var geocodedObject = new Parse.Object("GeocodedStores");
    promises.push(fn(data[k], geocodedObject));
}



Parse.Promise.when(promises).then(function () {
    response.success("DONE");
});