Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS承诺循环错误_Javascript_Angularjs_Angular Promise - Fatal编程技术网

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调用完成,回调函数堆栈开始被触发。是的,在中添加一个局部变量。然后回调函数将允许它保留引用,我很确定,但这基本上也是我在注释中试图说的。是的,在中添加一个局部变量。然后回调函数将允许它保留引用保留引用我很确定,但这基本上也是我在评论中试图说的。