1

私はphpファイルにリクエストをしています。応答は .done(function(msg){}); で処理されます。そして .fail これはうまくいきます。ただし、リクエストでエラーが発生する場合があります。私はこれをやり直しました。リトライも効く。しかし、最初に失敗し、de 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とfailです:

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

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

1 に答える 1

1

.done()および.fail()メソッドは、によって返されるオブジェクトに実装されるDeferred Objectの一部です。それらに登録したコールバックは オプションの一部ではないため、それらを別の に渡すことはできません。コードでは、親のDeferred Objectコールバックのみをサブスクライブしています。必要な結果を得るには、操作全体を別のDeferred オブジェクトでラップし、 /メソッドを使用して適切なコンテキストを渡す必要があります。また、 Deferred オブジェクトはその状態を解決済みまたは拒否済みに変更できることを覚えておく必要があります。jqXHR$.ajax()$.ajax()$.ajax()$.ajax() .resolveWith().rejectWith()1 回だけです (つまり、失敗した場合、後で成功することはできません)。したがって、最終的なコードは次のようになります。

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);
});
于 2013-07-22T09:57:11.050 に答える