我有一个configs
对象。对于configs
中的每个对象,我正在循环并使用$ http.get(在SPARQLService中)执行调用。 configs
对象包含不同的对象,因此对不同的URL进行了不同的调用。在该循环中,每当我从$ http.get获得承诺时,就在then
函数中更新$ rootScope中的对象。我得到的问题是configs
包含不同的对象,但是我正在rootScope中更新的对象都包含来自configs
的相似对象的结果。示例代码:
for (var config in configs ){
var newConfig = configs[config];
var data = SPARQLService.query(newConfig["endpointURL"],encodeURIComponent(newConfig["SPARQLQuery"]));
var bindings;
data.then(function (answer){
sparql_result = answer.data;
bindings = answer.data.results.bindings;
//creating the markers
markers = [];
for (var binding in bindings){
currentBind = bindings[binding];
var latitude = currentBind[newConfig["lat"]].value;
var longitude = currentBind[newConfig["long"]].value;
var currentMarker = L.marker([latitude, longitude]);
currentMarker.bindPopup(Utilities.generateDescription(newConfig["desc"],currentBind));
markers.push(currentMarker);
}
$rootScope.config[newConfig["groupName"]] = newConfig;
$rootScope.layers[newConfig["groupName"]] = L.layerGroup(markers);
console.log($rootScope.config);
},
function (error){
});
}
最佳答案
我认为您的问题是newConfig
函数中的then
通过引用绑定到newConfig
的值,因此,当promise完成执行时,它将采用当时newConfig
中的任何值-而不是调用诺言的时间。
每当外部循环执行时:
for (var config in configs ){
var newConfig = configs[config];
newConfig
将收到一个新值,但它不是一个新变量-在JavaScript中,for
循环不是变量的作用域,因此newConfig
实际上属于for
循环之外的作用域,即使它在那里声明。当您的then
函数访问newConfig
时,它正在访问的是当前位于该'全局'newConfig
中的值,该值很可能是循环的最后一次迭代产生的值(假设服务调用花了足够长的时间进行循环)在诺言返回之前完成)。您需要以某种方式将其传递给服务调用,以便它在
answer
函数的then
内容中可用。