我有一个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内容中可用。

10-08 16:26