使用 Azure 平台访问 JavaScript 中未定义的数组位置 returns
Accessing array position returns undefined in JavaScript using Azure platform
我有以下 JavaScript 对象:
var payload = {
"data": {
"title": item.title,
"time": item.time,
"location": item.location,
"latitude": item.latitude,
"longitude": item.longitude,
"invites": item.invites,
"encodedImage": item.encondedImage
}
};
item.invites
是一个用逗号分隔的大字符串。我使用一个函数根据逗号将字符串拆分为一个数组:
var userIdArray = splitArray(item.invites);
userIdArray.pop(); //last element is empty
//further down...
function splitArray(str) {
var array = new Array(); //explicitly declared out of despair
array = str.split(",");
return array;
}
然后我像这样迭代它:
for (var i = 0; i < userIdArray.length; i++) {
request.execute({
success: function() {
console.log("User: " + userIdArray[i]); //prints undefined...
但是即使 console.log(userIdArray);
正常打印数组,如果数组的长度仅为 1,我会得到未定义,但如果它是 2,它会打印 2nd 元素。 .. 为什么会这样?
我不熟悉 Azure,但按照代码的一般模式,似乎 success
是一个将在未来执行的函数,并且与循环范围无关:因此当处理程序执行时,它将看到一个错误的计数器变量 [i]
值。
(此外,它可能不会造成问题,但在循环头中声明和初始化的计数器变量是一种代码味道,并且可能有问题。)
如果不查看完整代码,我无法判断 [i] 是全局函数还是局部函数,但我认为它是全局函数,因为您没有得到 ReferenceError。
循环执行时无需等待所有未来的成功调用(它们是异步堆栈的并且与循环主体不同步),因此最后一个 [i++]
在 array.length 处求值,这将始终是未定义的,因为我们正在对数组进行索引。
request.execute 是同步的,将按预期从循环体内分派,但成功处理程序肯定不是。
至于在代码中正确表达意图,我认为 IIFE 可能会解决这个问题:(我对 request.execute 的作用一无所知,如果一次又一次地对同一对象调用 execute 是可以的,因此我说 可能):
for (var i = 0; i < userIdArray.length; i++) {
request.execute({
success: (function (counter) {
return function () {
console.log("User: " + userIdArray[counter]);
}
}(i))
});
}
我在这里进行合理的猜测。除此之外,我认为代码需要进行大量的重新思考和重构。循环中的回调通常表示存在重大逻辑缺陷。
我有以下 JavaScript 对象:
var payload = {
"data": {
"title": item.title,
"time": item.time,
"location": item.location,
"latitude": item.latitude,
"longitude": item.longitude,
"invites": item.invites,
"encodedImage": item.encondedImage
}
};
item.invites
是一个用逗号分隔的大字符串。我使用一个函数根据逗号将字符串拆分为一个数组:
var userIdArray = splitArray(item.invites);
userIdArray.pop(); //last element is empty
//further down...
function splitArray(str) {
var array = new Array(); //explicitly declared out of despair
array = str.split(",");
return array;
}
然后我像这样迭代它:
for (var i = 0; i < userIdArray.length; i++) {
request.execute({
success: function() {
console.log("User: " + userIdArray[i]); //prints undefined...
但是即使 console.log(userIdArray);
正常打印数组,如果数组的长度仅为 1,我会得到未定义,但如果它是 2,它会打印 2nd 元素。 .. 为什么会这样?
我不熟悉 Azure,但按照代码的一般模式,似乎 success
是一个将在未来执行的函数,并且与循环范围无关:因此当处理程序执行时,它将看到一个错误的计数器变量 [i]
值。
(此外,它可能不会造成问题,但在循环头中声明和初始化的计数器变量是一种代码味道,并且可能有问题。)
如果不查看完整代码,我无法判断 [i] 是全局函数还是局部函数,但我认为它是全局函数,因为您没有得到 ReferenceError。
循环执行时无需等待所有未来的成功调用(它们是异步堆栈的并且与循环主体不同步),因此最后一个 [i++]
在 array.length 处求值,这将始终是未定义的,因为我们正在对数组进行索引。
request.execute 是同步的,将按预期从循环体内分派,但成功处理程序肯定不是。
至于在代码中正确表达意图,我认为 IIFE 可能会解决这个问题:(我对 request.execute 的作用一无所知,如果一次又一次地对同一对象调用 execute 是可以的,因此我说 可能):
for (var i = 0; i < userIdArray.length; i++) {
request.execute({
success: (function (counter) {
return function () {
console.log("User: " + userIdArray[counter]);
}
}(i))
});
}
我在这里进行合理的猜测。除此之外,我认为代码需要进行大量的重新思考和重构。循环中的回调通常表示存在重大逻辑缺陷。