Javascript 循环内部闭包

标签 javascript

window.config = {
"Environments": [
    "LH5",
    "LH8",
    "AMS"
],
"Clusters": [
    4,
    4,
    4
]
};

下面是 promise 对象:

for (var i = 0; i < window.config.Environments.length; i++) {

    for (var j = 1; j < window.config.Clusters[i] + 1; j++) {

      promiseObj.physical[window.config.Environments[i] + "#Cluster" + j] = $http.get('http://url0/search?idc=' + window.config.Environments[i] + '&type=Physical&cluster=' + j).success(function(data) {


            $scope.servers = data; // get data from json

            countcores[window.config.Environments[i] + "#Cluster" + j] = 0;
            countmemory[window.config.Environments[i] + "#Cluster" + j] = 0;

            angular.forEach($scope.servers, function(item) {

                countcores[window.config.Environments[i] + "#Cluster" + j] = parseInt(countcores[window.config.Environments[i] + "#Cluster" + j]) + parseInt(item.cores);
                countmemory[window.config.Environments[i] + "#Cluster" + j] = parseInt(countmemory[window.config.Environments[i] + "#Cluster" + j]) + parseInt(item.memory);

            });


        });

           promiseObj.virtual[window.config.Environments[i] + "#Cluster" + j] = $http.get('http://url/search?idc=' + window.config.Environments[i] + '&type=Virtual&cluster=' + j).success(function(data) {


            $scope.servers = data; // get data from json

            countvirtualcores[window.config.Environments[i] + "#Cluster" + j] = 0;
            countvirtualmemory[window.config.Environments[i] + "#Cluster" + j] = 0;


            angular.forEach($scope.servers, function(item) {

                countvirtualcores[window.config.Environments[i] + "#Cluster" + j] = parseInt(countvirtualcores[window.config.Environments[i] + "#Cluster" + j]) + parseInt(item.cores);
                countvirtualmemory[window.config.Environments[i] + "#Cluster" + j] = parseInt(countvirtualmemory[window.config.Environments[i] + "#Cluster" + j]) + parseInt(item.memory);

            });


        });

}
}

似乎发生的情况是循环比 Promise 对象更快,并且 j 在 Promise 对象之前达到 5,并且记录的是

["undefined#Cluster5"] = 1280

我期待的是

["LH5#Cluster1"] = somevalue;
["LH5#Cluster2"] = somevalue;
["LH5#Cluster3"] = somevalue;
["LH5#Cluster4"] = somevalue;

["LH8#Cluster1"] = somevalue;
["LH8#Cluster2"] = somevalue;
["LH8#Cluster3"] = somevalue;
["LH8#Cluster4"] = somevalue;

["AMS#Cluster1"] = somevalue;
["AMS#Cluster2"] = somevalue;
["AMS#Cluster3"] = somevalue;
["AMS#Cluster4"] = somevalue;

我有多个 PromiseObjectives 在同一个循环中运行 - 这是如何工作的?我知道JavaScript closure inside loops – simple practical example - 但这对我没有帮助,我需要进一步的帮助。

最佳答案

引用的URL旨在以简单的方式举例说明您需要做什么。您遇到的问题与 URL 中引用的问题相同。您需要确保您正在确定 i 的范围。 & j每个函数调用的变量。因此,您需要围绕传入 i 的 success 函数进行闭包。 & j变量返回您希望在 success() 时调用的函数被称为$http.get()功能。

我不会执行确切的代码,但它看起来有点类似于:

$http.get('http://url').success(function(i,j){
    return function (data){
        //code stuff happens here
    }
}(i,j));

这样function(i,j){ ... }(i,j)被调用,然后返回实际函数 return function(data){}i & j变量的作用域正确,并且具有函数 function(i,j){ ... }(i,j) 时它们所做的值。被叫了。

**作为旁注,我将更改作用域变量名称 i & j更具描述性且不易混淆的内容

关于Javascript 循环内部闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358928/

相关文章:

javascript - 如何获得 CSS 旋转元素的实际(非原始)高度

javascript - 数组并显示为未定义

javascript - Next Js 结合外部 REST API 身份验证和授权

php - 用php代码调用javascript函数

javascript - 在 Angular CLI 1.2.4 中导入 JS

javascript - 在 Internet 区域处于高安全模式时,网站在 IE8 中出现乱码

javascript - JavaScript + CSS3 动画的内存问题。如何提高?

javascript - 使用 http post 请求传递有关事件更改的参数

javascript - 在 Jquery 中填充数组并传递给 Controller

javascript - 图像作为基于 javascript 的粒子网络效果的节点?