JavaScript /使用回调保存变量值

时间:2014-12-10 08:07:57

标签: javascript angularjs

我在Angular.js中有以下代码:

$scope.createSSH = function(){
             for (var j=0; j<allGroupsArrays.length; j++){
                for (var i=0; i<$scope.appArray.length; i++){
                  allGroupsArrays[j][i][6] = Boolean(0);
                  allGroupsArrays[j][i][7] = Boolean(0);
                  // Some irrelvant code
                  WClient.createSSHK(allGroupsArrays[j][i][2], allGroupsArrays[j][i][3], allGroupsArrays[j][i][4], i, allGroupsArrays[j], allGroupsArrays[j][i][7], j).then(
              function(data) {
                    console.log("The j is: " + j)
                    console.log("The i is: " + i)
                  },
              function(message) {
                    console.log("Error")
                  }

当支持回调时,我注意到ji变量值是note save。相反,它打印以下内容:

The j is: 5
The i is: 3

即使执行回调,i为0且j为0。

如何保存变量的值上下文?

3 个答案:

答案 0 :(得分:0)

当调用回调函数时,ij值取自父上下文,并且当它们递增时,值将始终最后递增(53分别)。要解决此问题,您必须传递要使用的当前值:

.then((function(i, j) {
    return function(data) {
        console.log("The j is: " + j)
        console.log("The i is: " + i)
    };
})(i, j))

在这里创建函数接收当前值(function(i, j) {...},立即调用它(i, j))并让它们独立于父上下文。此函数返回要执行的函数(return function(data) {...})。现在,您已经通过回调调用者data传递了i j,并在createSSHK调用时传递了值。

答案 1 :(得分:0)

在循环中创建函数绝不是一个好主意。尝试这样的事情:

$scope.createSSH = function(){
         for (var j=0; j<allGroupsArrays.length; j++){
            for (var i=0; i<$scope.appArray.length; i++){
              allGroupsArrays[j][i][6] = Boolean(0);
              allGroupsArrays[j][i][7] = Boolean(0);
              process(i ,j);
            }
         }

 function process(i, j){
              WClient.createSSHK(allGroupsArrays[j][i][2], allGroupsArrays[j][i][3], allGroupsArrays[j][i][4], i, allGroupsArrays[j], allGroupsArrays[j][i][7], j).then(
          function(data) {
                console.log("The j is: " + j)
                console.log("The i is: " + i)
              },
          function(message) {
                console.log("Error")
              }
 }

答案 2 :(得分:0)

这是关闭典型问题。循环执行,完成后值ij当然是53。但是,then回调函数仍使用外部作用域中的这些ij值。您需要做的是创建一个单独的范围值。

一种方法(并且至少有6种方法!)正在使用函数的Function.prototype.bind方法。它的工作原理是因为它创建了具有ij的范围值的新函数:

WClient.createSSHK(allGroupsArrays[j][i][2], allGroupsArrays[j][i][3], allGroupsArrays[j][i][4], i, allGroupsArrays[j], allGroupsArrays[j][i][7], j).then(
    function(i, j, data) {
        console.log("The j is: " + j)
        console.log("The i is: " + i)
    }.bind(null, i, j),

    function(message) {
        console.log("Error")
    }.bind(null, i, j)
);

另请参阅同一主题的this非常受欢迎的问题。