【问题标题】:For loop returns same value repeatedly in Ajax call [duplicate]For循环在Ajax调用中重复返回相同的值[重复]
【发布时间】:2011-12-28 15:04:44
【问题描述】:

我正在尝试使用 for 循环来循环遍历 URL 数组并将它们用于 ajax 调用。在 ajax 调用之外,i 正确更改值,但是当我尝试从调用内部访问它时,它总是返回2。它正确循环但具有相同的值,而不是循环通过0, 1 等。

var i = 0;
for(i = 0; i <= 1; ++i) {
    console.log("Value outside of call = " + i);
    $.ajax({
        url : urls[i],
        dataType : 'jsonp',
        timeout : 3000,
        count : 0,
        success : function(data) {
            console.log("Value inside of call = " + i);
            shotInfo[i] = data;
        },
        error : function() {
        }
    })
}

我也尝试过使用while 循环,但效果相同。

【问题讨论】:

  • @TomalakGeret'kal 不管怎样让你睡得好,这很苛刻。这家伙可能是新来的。我猜你从来没有犯过愚蠢的错误。刚看,他14岁。至于投赞成票,我同意,但我不会费心为粗鲁的人投反对票。
  • 我做了研究,包括 SO 和网络,抱歉。我很想读一本书,你会推荐什么?
  • 如果我们什么都不放在心上,更专业一点,那就太好了。这是一个初学者的问题,我们必须帮助初学者理解。 @ZenshanA 您可以从记录器中轻松理解。在 AJAX 之外的所有日志都打印出来之后,您可以看到 AJAX 中的日志。
  • 在这里对您有帮助的是理解变量作用域,这是初学者的概念,但我看到这种混淆经常出现在 ajax 和异步调用中。请记住,您的 success 选项是 callback,它不会与循环一起执行。
  • @hop 的最后一条评论就是您要查找的内容。您可以将索引添加为查询字符串参数并将其作为数据的一部分返回。

标签: javascript variables jquery for-loop


【解决方案1】:

您只有一个变量i。当回调触发时,它的最终值为2

制作a closure

【讨论】:

    【解决方案2】:

    回调函数在 AJAX 调用完成后调用。为防止这种情况,请尝试将 async 设置为 false

    var i = 0;
    
    for(i = 0; i <= 1; ++i) {
    
    console.log("Value outside of call = " + i);
    
    var currentIndex = i;
    
    $.ajax({ url : urls[currentIndex], dataType : 'jsonp', timeout : 3000, count : 0, async : false, success : function(data) {
    
    console.log("Value inside of call = " + currentIndex);
    
    shotInfo[currentIndex] = data;
    
    },
    
    error : function() {
    
    }
        })
    }
    

    【讨论】:

    • 永远不要将异步设置为假!!仅仅因为它使您的代码更简单而让用户受苦是一个坏主意。
    【解决方案3】:

    基本上,成功回调发生在 AJAX 请求完成之后。这可能是问题所在。试试这是否可行。

    var i = 0;
    for(i = 0; i <= 1; ++i) {
        console.log("Value outside of call = " + i);
        var currentIndex = i;
        $.ajax({
            url : urls[currentIndex],
            dataType : 'jsonp',
            timeout : 3000,
            count : 0,
            success : function(data) {
                console.log("Value inside of call = " + currentIndex);
                shotInfo[currentIndex] = data;
            },
            error : function() {
            }
        })
    }
    

    【讨论】:

    • 感谢您的回复,但该代码也有同样的问题。在我问更多愚蠢的问题之前,我正在阅读关于闭包的内容,再次感谢!
    • 是的,你是对的。可能,我建议您通过 AJAX 请求携带 currentIndex 并从响应中读取索引。
    • 很抱歉这么厚,但我不太清楚你的意思,如果不是太麻烦的话,你能解释一下你的意思吗?跨度>
    • 您需要在请求中将当前索引作为参数发送,并在响应中发回。它可以是 url:urls[currentIndex]+'?currentIndex='+currentIndex.在您的代码中,您需要将其与响应一起添加。说它会像 shotInfo[data.currentIndex] = data.actualData;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2016-12-26
    相关资源
    最近更新 更多