执行多个http请求 - 解析云代码

时间:2017-09-14 15:02:03

标签: promise parse-server parse-cloud

我有一系列商店,其中存储了地址和其他一些东西。

现在我想迭代这个数组并对lat / lng coords进行地理编码并将它们保存到数据库中。

使用下面的代码我得到同一商店的两个或三个条目。我是否会错过这里的范围?

谢谢!

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);

1 个答案:

答案 0 :(得分:0)

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

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");
});