【问题标题】:Manage timeout ajax request管理超时 ajax 请求
【发布时间】:2014-09-18 12:44:21
【问题描述】:

我想用.when.then 管理一个超时的ajax 调用。

我有一个这样的脚本:

$.when(
        $.ajax({   
            url: url_ajax, 
            type: "GET", 
            async: true,
            data: window.location.search, 
            dataType: "json", 
            timeout: 30000,
            success: function(data) {
                console.log('ok');
            },
            error: function(data) {

            }
        }),
        $.ajax({   
            url: url_ajax, 
            type: "GET", 
            async: true,
            data: window.location.search, 
            dataType: "json", 
            success: function(data) {
                console.log('ok');
            },
            timeout: 30000,
            error: function(data) {

            }
        })
     ).then(function() {
          alert('end');
     });

如果 ajax 请求超时,则不会调用回调 .then,并且我看不到最后一个警报。 因此,如果我的 ajax 请求超时,我将无法退出进入 then 函数。

我也尝试在每个 ajax 请求之后添加这个:

.fail(function(jqXHR, textStatus){
            if(textStatus == 'timeout')
            {     
                alert('Failed from timeout'); 
            }
         })

但又没有进入then函数

如何管理超时? 谢谢

【问题讨论】:

  • 查看 API:api.jquery.com/deferred.then。你试过.then(successCallbackFunction, failCallbackFunction)吗?
  • 您能否提供一个包含我的代码的示例,以便更好地理解什么是好方法? @mccannf

标签: jquery ajax


【解决方案1】:

您是否尝试过像这样使用.then(successCallbackFunction, failCallbackFunction)

$.when(
    $.ajax({   
        url: url_ajax, 
        type: "GET", 
        async: true,
        data: window.location.search, 
        dataType: "json", 
        timeout: 30000,
        success: function(data) {
            console.log('ok');
        },
        error: function(data) {

        }
    }),
    $.ajax({   
        url: url_ajax, 
        type: "GET", 
        async: true,
        data: window.location.search, 
        dataType: "json", 
        success: function(data) {
            console.log('ok');
        },
        timeout: 30000,
        error: function(data) {

        }
    })
 ).then( // success
         function() {
           alert('Success!');
         },
         // failure
         function(jqXHR, textStatus){
            if(textStatus == 'timeout')
            {     
                alert('Failed from timeout'); 
            } else {
                alert('Failed from: '+textStatus);
            }
         }
 );

【讨论】:

  • 有一个小问题,如果第一个被中止,在第二个结束之前立即进入故障函数。如果出现错误,我希望在所有请求完成后运行失败功能。有可能吗?
  • 你需要一些定制的东西。看这个问题的第二个答案:stackoverflow.com/questions/5518181/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多