javascript - 使用 Azure 平台访问数组位置在 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,
        "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 。

循环执行时无需等待所有 future 的成功调用(这些调用是异步堆栈的,与循环体不同步),因此最后一个 [i++] 在 array.length 处计算,由于我们索引的是数组,因此它始终是未定义的。

request.execute 是同步的,并将按预期从循环体内分派(dispatch),但成功处理程序肯定不是。

至于在代码中正确表达意图,我认为 IIFE 可能会解决这个问题:(我对 request.execute 的作用为零,并且一次又一次地在同一个对象上调用执行是否可以,因此我这么说可能):

for (var i = 0; i < userIdArray.length; i++) {
     request.execute({
        success: (function (counter) {
            return function () {
                console.log("User: " + userIdArray[counter]);
            }
        }(i))
    });
 }

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

关于javascript - 使用 Azure 平台访问数组位置在 JavaScript 中返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30447494/

相关文章:

javascript - jQuery Ajax 如果提交时的变量可以隐藏按钮

arrays - 如何获取数组中的下一个元素但如果当前是最后一个则获取第一个

python - 根据搜索条件从 Python 数组中返回随机元素

azure - 如何以编程方式将用户分配的托管标识分配给 Azure Web App 暂存槽?

用于测试开源项目的Windows云实例?

azure - 如何选择正确的Service Fabric可靠性层?

javascript - 无法获取内容脚本 Firefox Addon 中的范围

javascript - 如何使用 SignalR 向特定客户端发送消息

javascript - 过滤日期数组

java - 在二维数组中切换数组大小需要不同的内存量