2017-09-14 125 views
0

我有一个商店阵列,其中存储地址和其他一些东西。执行多个http请求 - 解析云代码

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

通过下面的代码,我得到了同一商店的双重或三重条目。我想念这里的范围吗?

谢谢!

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

回答

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