我在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")
}
当支持回调时,我注意到j
和i
变量值是note save。相反,它打印以下内容:
The j is: 5
The i is: 3
即使执行回调,i
为0且j
为0。
如何保存变量的值上下文?
答案 0 :(得分:0)
当调用回调函数时,i
和j
值取自父上下文,并且当它们递增时,值将始终最后递增(5
和3
分别)。要解决此问题,您必须传递要使用的当前值:
.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)
这是关闭典型问题。循环执行,完成后值i
和j
当然是5
和3
。但是,then
回调函数仍使用外部作用域中的这些i
和j
值。您需要做的是创建一个单独的范围值。
一种方法(并且至少有6种方法!)正在使用函数的Function.prototype.bind
方法。它的工作原理是因为它创建了具有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(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非常受欢迎的问题。