【问题标题】:jquery $get ajax call not always waiting for responsejquery $get ajax 调用并不总是等待响应
【发布时间】:2014-08-28 10:05:20
【问题描述】:

我有一个 jquery ajax 调用如下...

$(".eetag").each(function(){
    var currentItem = $(this);
    var desc = $(this).attr('data-desc');
    $.get('service/transactionCategoryByKeyword.json',{'phrase': desc}, function(data){
        //alert(":" + desc + ":" + data.tranCategoryCode);
        $(currentItem).tagsinput('add', data);
    });
});

它有时有效,有时无效,我认为是因为我没有告诉它等到成功?是对的吗?有人可以建议应该如何编写调用吗?

---编辑---

谢谢大家。在做了一些研究之后,我重新编写了 ajax 调用,它好多了,但我有时仍然看到 ajax 没有等待。特别是它只发生(即不等待)我页面上的第一个 eetag。我是否正确地重写了它?

$(".eetag").each(function(){
    var currentItem = $(this);
    var desc = $(this).attr('data-desc');
    $.ajax({ 
        url: 'service/transactionCategoryByKeyword.json',           
        type: 'GET',
        async: false,
        contentType: 'application/json',
        data: {'phrase': desc},     
        success: function(data) {
            $(currentItem).tagsinput('add', data);
        }
    });     
});

谢谢

【问题讨论】:

  • 它不会。因为是异步函数
  • 如果您希望它在执行其余代码之前完成,您将需要使用 $.ajax() 函数并将 aynsc 选项设置为 false。
  • 我已经根据您的 cmets 尝试修复它,它现在几乎一直在工作,但我确实注意到有时它似乎仍然没有等待。我有什么遗漏吗?
  • 我再次编辑了我的帖子。我现在唯一的问题是,在极少数情况下,对于页面上的第一个 eetag,我有时不会得到结果。

标签: jquery ajax


【解决方案1】:

您可以递归地遍历 .eetags。这样 eetag 就会一个接一个地处理。

function recursiveAjaxCall(elements, index, callback) {
    if(index < elements.length) {
        var currentItem = elements[index];
        var desc = $(currentItem).attr('data-desc');
        $.ajax({
            dataType: 'json',
            type: 'GET',
            url: 'service/transactionCategoryByKeyword.json',
            data: {'phrase': desc},
            success: function(data) {
                $(currentItem).tagsinput('add', data);
                recursiveAjaxCall(elements, index+1, callback);
            },
            error: function(error) {
                recursiveAjaxCall(elements, index+1, callback);
            }
        })
    }
    else {
        callback();
    }
}


var elements = $(".eetag");
recursiveAjaxCall(elements, 0, function() {
    //done
});

【讨论】:

  • 嗨,感谢您的帮助,就在您发布答案之前,我尝试了类似但没有递归的方法(请参阅我的编辑),您为什么建议我们需要递归调用?
  • 我通常就是这样解决这个问题的。我不知道 jQuery.ajax() 有一个异步选项。您的解决方案更直接,所以我会坚持下去。
【解决方案2】:

尝试使用when()

$(".eetag").each(function(){
  var currentItem = $(this);
  var desc = $(this).attr('data-desc');
  $.when($.get('service/transactionCategoryByKeyword.json',{'phrase': desc})).then(function( data, textStatus, jqXHR){
    //alert(":" + desc + ":" + data.tranCategoryCode);
    $(currentItem).tagsinput('add', data);
  });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多