Javascript AngularJS承诺循环错误
我有一个Javascript AngularJS承诺循环错误,javascript,angularjs,angular-promise,Javascript,Angularjs,Angular Promise,我有一个configs对象。对于configs中的每个对象,我使用$http.get(在SPARQLService中)循环并执行调用。configs对象包含不同的对象,因此对不同的URL执行不同的调用。在该循环中,每当我从$http.get获得承诺时,在然后函数中,我都会更新在$rootScope中找到的对象。我遇到的问题是,configs包含不同的对象,但我在rootScope中更新的对象都包含来自configs的类似对象的结果。示例代码: for (var config in config
configs
对象。对于configs
中的每个对象,我使用$http.get(在SPARQLService中)循环并执行调用。configs
对象包含不同的对象,因此对不同的URL执行不同的调用。在该循环中,每当我从$http.get获得承诺时,在然后函数中,我都会更新在$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
的值,因此当承诺完成执行时,它将接受当时newConfig
中的任何值,而不是调用承诺时的值
每次执行外部循环时:
for (var config in configs ){
var newConfig = configs[config];
newConfig
将接收一个新值,但它不是一个新变量-在JavaScript中for
循环不是变量的作用域,因此newConfig
实际上属于for
循环之外的作用域,即使它在那里声明。当then
函数访问newConfig
时,它正在访问当前驻留在该“全局”newConfig
中的值,该值很可能是循环最后一次迭代中的值(假设服务调用需要足够长的时间才能完成循环,然后承诺才会返回)
您需要以某种方式将其传递给服务呼叫,以便在then
功能中的answer
内容中提供 我认为您的问题在于newConfig
中的then
函数通过引用绑定到newConfig
的值,因此当承诺完成执行时,它将接受当时newConfig
中的任何值,而不是在承诺被调用时
每次执行外部循环时:
for (var config in configs ){
var newConfig = configs[config];
newConfig
将接收一个新值,但它不是一个新变量-在JavaScript中for
循环不是变量的作用域,因此newConfig
实际上属于for
循环之外的作用域,即使它在那里声明。当then
函数访问newConfig
时,它正在访问当前驻留在该“全局”newConfig
中的值,该值很可能是循环最后一次迭代中的值(假设服务调用需要足够长的时间才能完成循环,然后承诺才会返回)
您需要以某种方式将其传递给服务呼叫,以便在then
功能中的answer
内容中提供 我想您的问题可能是var newConfig
在循环中引用它的函数外部声明newConfig
将在循环的每次迭代中更新,但对它的引用在异步触发的函数中使用,请相信它们在执行时都将引用相同的newConfig
。。。将使用带有断点的调试器验证这一点,其中newConfig用于将内容分配给$rootScope。但为什么newConfig对象引用configs中的最后一个对象?我认为是这样的,当您执行调用时。然后,您给它一个新函数,以便在将来某个时候调用,但它不会立即执行,继续循环并更新newConfig,直到完成所有配置的循环,此时newConfig指向最后一件事,现在,异步http调用完成,回调函数堆栈开始触发。您认为问题可能是var newConfig
在循环中引用它的函数外部声明newConfig
将在循环的每次迭代中更新,但对它的引用在异步触发的函数中使用,请相信它们在执行时都将引用相同的newConfig
。。。将使用带有断点的调试器验证这一点,其中newConfig用于将内容分配给$rootScope。但为什么newConfig对象引用configs中的最后一个对象?我认为是这样的,当您执行调用时。然后,您给它一个新函数,以便在将来某个时候调用,但它不会立即执行,继续循环并更新newConfig,直到完成所有配置的循环,此时newConfig指向最后一件事,现在异步http调用完成,回调函数堆栈开始被触发。是的,在中添加一个局部变量。然后回调函数将允许它保留引用,我很确定,但这基本上也是我在注释中试图说的。是的,在中添加一个局部变量。然后回调函数将允许它保留引用保留引用我很确定,但这基本上也是我在评论中试图说的。