2013-07-22 1 views
1

PHP 파일을 요청하고 있습니다. 응답은 .done (function (msg) {});으로 처리됩니다. .fail이 작동합니다. 하지만 때로는 요청에 오류가 발생합니다. 나는 이것을 재 시도했다. 재 시도도 가능합니다.성공한 아약 재시도 없음 .done

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; 
         } 
       } 
      }) ; 

그리고 : 처음에 실패하고 드에 성공한다면 2 ~ 3

내 요구를 (I가 성공했는지 볼 수 있습니다 불을 지르고에서) 내 request.done 화재를하지 않습니다 시도 이것은되는 .done이고 실패 :

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

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

답변

1

.done().fail() 및 방법 $.ajax() 의해 반환 jqXHR 오브젝트에 구현되어 Deferred Object의 일부이다. 사용자가 등록한 콜백은 $.ajax() 옵션의 일부가 아니므로 다른 $.ajax()에 전달할 수 없습니다. 귀하의 코드에서 부모에게만 가입하고 있습니다 $.ajax()지연된 객체 콜백. 원하는 결과를 얻으려면 지연된 객체에 전체 작업을 래핑하고 .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); 
}); 
+0

고마워요! 이런 식으로 생각하지 않았습니다. – Annaspaz