2017-09-14 128 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"); 
});