使用Azure平台访问数组位置返回JavaScript中未定义的

使用Azure平台访问数组位置返回JavaScript中未定义的,javascript,arrays,azure,serverside-javascript,Javascript,Arrays,Azure,Serverside Javascript,我有以下JavaScript对象: var payload = { "data": { "title": item.title, "time": item.time, "location": item.location, "latitude": item.latitude, "longitude": item.longitude, "invites": item.invites,

我有以下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.invests
是一个用逗号分隔的大字符串。我使用函数根据逗号将字符串拆分为数组:

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...
for(var i=0;i

但是即使
console.log(userIdArray)
正常打印数组,如果数组的长度只有1,我将无法定义,但是如果数组的长度为2,它将打印第2个元素…为什么会发生这种情况?

我不熟悉Azure,但是按照代码的一般模式,似乎
success
是一个将在将来执行的函数,并且不会绑定到循环scope:因此,当处理程序执行时,它将看到一个错误的计数器变量
[i]

(此外,它可能不会造成问题,但在循环头中声明和初始化的计数器变量是一种代码味道,可能会有问题。)

如果不看完整的代码,我无法判断[I]是包装函数的全局还是局部,但我认为它是全局的,因为您没有得到引用错误

循环执行时不会等待所有未来的成功调用(这些调用是异步堆叠的,与循环体不同步),因此最后一个
[i++]
将以array.length进行计算,由于我们正在对数组进行索引,因此始终未定义array.length

request.execute是同步的,将按照预期从循环体中进行调度,但成功处理程序肯定不是

至于在代码中正确表达意图,我认为IIFE可能会解决这个问题:(我不知道request.execute做什么,如果反复调用同一个对象上的execute是可以的,那么我说它可能会):

for(var i=0;i

我在这里给出了一个合理的猜测。除此之外,我认为代码需要进行重大的重新思考和重构。循环中的回调通常表明存在一个主要的逻辑缺陷。

原因是该函数稍后调用,并且
I
到那时等于
userIdArray.length
(带后续
i++
的循环结束)当然,这不是数组的有效索引。如果数组的位置为1,那么它只会迭代一次。因为ii最终将是
1
,而最大索引将是
0
i++/code>是t在
for
循环结束时执行的最后一条语句。所以应该是ifor (var i = 0; i < userIdArray.length; i++) { request.execute({ success: (function (counter) { return function () { console.log("User: " + userIdArray[counter]); } }(i)) }); }