成功的Ajax后重试没有.done(after successful ajax retry no .

2019-09-29 06:27发布

我在做一个PHP文件的请求。 该响应在.done(函数(MSG){})进行处理; 和.fail这工作得很好。 但有时请求得到一个错误。 我做了一个重试这个。 重试也适用。 但是,如果第一次失败,它是成功的在德2或3尽我request.done没有做火(在Firebug我可以看到,就是成功)

我的请求:

    var request = $.ajax({    
                url:            "wcf.php",            
                type:           "POST",     
                dataType:       "xml",
                async:          false,
                timeout:        5000,
                tryCount:       0,
                retryLimit:     3,
                data:      { barcode: value, curPrxID: currentPrxID, timestamp: (new Date).getTime()},
                error: function (xhr, ajaxOptions, thrownError) {
                    if (xhr.status == 500) {
                        alert('Server error');
                    } 
                        this.tryCount++;
                        if (this.tryCount < this.retryLimit) {
                            $.ajax(this);
                            //return;
                        }
                }
           }) ;  

这是中,.done和失败:

request.done(function(msg) 
{
    $(msg).find("Response").each(function()
    {
             // my code here
    });
});

request.fail(function(jqXHR, textStatus, errorThrown) 
{ 
    $("#message").html(errorThrown);    
});

Answer 1:

.done().fail()方法的一部分递延对象这是在实施jqXHR通过返回的对象$.ajax() 你与他们注册回调都没有的一部分$.ajax()选项,所以你不能把它们传递给另一个$.ajax() 在你的代码是只预订父$.ajax() 递延对象回调。 为了达到你想要的结果,你应该在另一个Deferred对象包住整个操作和使用.resolveWith() / .rejectWith()方法来传递正确的上下文。 另外你需要记住, 递延对象可以其状态更改为解决拒绝一次(换句话说,如果它失败,以后无法成功)。 所以,最终的代码可能是这样的:

var request = $.Deferred(function(deferred) {
    $.ajax({    
        url: 'wcf.php',
        type: 'POST',
        dataType: 'xml',
        async: false,
        timeout: 5000,
        tryCount: 0,
        retryLimit: 3,
        data: { barcode: value, curPrxID: currentPrxID, timestamp: (new Date).getTime()},
        error: function (xhr, ajaxOptions, thrownError) {
            if (xhr.status == 500) {
                alert('Server error');
            }
            this.tryCount++;
            if (this.tryCount < this.retryLimit) {
                $.ajax(this).done(function(data, textStatus, jqXHR) {
                    deferred.resolveWith(this, [data, textStatus, jqXHR]);
                }).fail(function(jqXHR, textStatus, errorThrown) {
                    if (this.tryCount >= this.retryLimit) {
                        deferred.rejectWith(this, [jqXHR, textStatus, errorThrown]);
                    }
                });
            }
        }
    }).done(function(data, textStatus, jqXHR) {
        deferred.resolveWith(this, [data, textStatus, jqXHR]);
    });
}).promise();

request.done(function(msg) {
    $(msg).find("Response").each(function() {
        //Success code here
    });
});

request.fail(function(jqXHR, textStatus, errorThrown) { 
    $("#message").html(errorThrown);
});


文章来源: after successful ajax retry no .done