【问题标题】:How to get Ajax to return values from previous request?如何让 Ajax 从先前的请求中返回值?
【发布时间】:2013-12-20 00:52:19
【问题描述】:

我正在尝试在下面的每次迭代中将文本(先前创建的数组中的值)附加到 DIV。 Ajax 调用似乎正在等待返回其输出,直到所有迭代都完成。

有没有办法在每次迭代中追加?

谢谢。

var inputValue = [];

$("form#null_form :input[type=text]").each(function () {
    inputValue.push($(this).prop('value'));
});

for (var i = 1; i < inputValue.length; i++) {
    $.ajax({
        url: "http://urlthatdoessomething.xxx",
        type: 'POST',
        dataType: 'json',
        success: function (output_string) {
            $('#results').append('<p class=\"normal-msg\">' + inputValue[i] + ' column successfully converted...</p> ');
        },
        error: function (output_string) {
            $('#results').append('<p class=\"error-msg\">ERROR:  Check spelling and try again... </p> ');
        }
    });
}

【问题讨论】:

  • for 中的 AJAX 可能很危险。如果服务器宕机了,你发送大量请求到死胡同!
  • 另外,不能保证您会按照 ajax 调用的顺序附加它们。
  • 看起来很奇怪,您没有向服务器发送任何内容,也没有得到您实际使用的任何内容,并且您为匹配表单中的每个输入发送了一个 ajax 请求? ajax 请求到底在做什么,你希望它输出什么。作为旁注,您需要一个闭包来保持异步回调中 i 的值不变
  • @tymeJV - 此例程位于站点的后端,很少使用。 Ajax 调用需要处理的项目数量各不相同,这就是我目前将其置于循环中的原因。有没有更好的 方法来实现这一点?接受建议。谢谢。
  • @adeneo - 该例程确实在外部数据库中进行了更改。我只是没有在示例中包含细节。

标签: jquery ajax loops for-loop append


【解决方案1】:

AJAX 根据定义是异步的。这意味着您的代码在进入 for 循环之前不会等待来自 http://urlthatdoessomething.xxx 的响应。实际上,for 循环会快速发出所有 AJAX 请求,并在响应进入时附加文本。迭代已经发生,实际上时间如此接近,以至于响应似乎都同时返回,所有文本似乎同时附加。

解决这个问题的方法是在AJAX函数的回调中调用下一个请求,而不是用for循环。这样,下一个请求将在前一个请求完成之前不会执行,从而为您提供您期望的迭代之间的时间。

var requestsCount = 1;
function makeRequest(i) {
    $.ajax({
        url: "http://urlthatdoessomething.xxx",
        type: 'POST',
        dataType: 'json',
        success: function (output_string) {
            $('#results').append('<p class=\"normal-msg\">' + inputValue[i] + 
              ' column successfully converted...</p> ');
            if (requestsCount < inputValue.length) {
                makeRequest(requestsCount + 1);
                requestsCount ++;
            }
        },
        error: function (output_string) {
            $('#results').append('<p class=\"error-msg\">
               ERROR:  Check spelling and try again... </p> ');
        }
    });
}
makeRequest(inputValue[1]);

旁注:以上是您的代码的翻译。您可能打算在 for 循环中写入 var i = 0,因为数组是零索引的。如果是这种情况,请将var requestsCount = 1; 更改为var requestsCount = 0; 并将makeRequest(inputValue[1]); 更改为makeRequest(inputValue[0]);

【讨论】:

  • @dsiler12221 - 谢谢。是的,因为我忽略了表单中的第一个输入字段,所以我从 1 开始迭代。
  • 这能回答你的问题吗?如果是这样,您可以将其标记为答案吗?如果没有,我能帮你什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多