2013-07-23 2 views
22

Fyi, jQuery 약속을 배우기 시작 했으므로 여기서 약간 혼란 스러울 수 있습니다. 내가 예상대로jQuery Deferred : 완료 필터 내에서 약속을 거부합니다.

return doAJAXRequest().then(function (data) { 
    if (data.responseText == "YES") { 
     return doOtherAJAXRequest(); 
    } else { 
     this.reject(data); 
    } 
}); 

작동하지 않았다 :

Uncaught TypeError: Object #<Object> has no method 'reject' 
어쨌든

, 나는 내가 응답의 내용에 따라 수행 필터 내에서 거부하려는 AJAX 요청이

응답을 기반으로이 약속을 실패하게하려면 어떻게해야합니까? 그게 가능하니? 아니면 여기서해야 할 일에 대해 혼란 스럽습니까?

+0

this.reject를 $ (this) .reject로 변경해보십시오. – rtimoshenko

+0

@rtimoshenko 맞습니까? – alex

+0

@rtimoshenko 그게 작동하지 않는 것 같은데, 나는 여전히 같은 오류가 발생합니다. 편집 : 실제로 정확히 동일하지 않지만 여전히 매우 유사합니다. ('Uncaught TypeError : Object [object Object]에 'reject'메소드가 없습니다.) – Ajedi32

답변

31

jQuery (다른 라이브러리와 달리)는 '해결됨'상태에서 '거부 됨'상태로 약속을 변형시키는 것은 다소 장황합니다. 새로운 지연에 대한 명시 적 생성 및 거부가 필요합니다. 여전히 data이 전달 될 수 있도록하면서

function foo() { 
    return doAJAXRequest().then(function (data, textStatus, jqXHR) { 
     if (data.responseText == "YES") { 
      return doOtherAJAXRequest(data); 
     } else { 
      return $.Deferred().reject(jqXHR, data, 'Not YES').promise(); 
     } 
    }); 
) 

여기, 약속, (부분) data.responseText !== "YES" 모방 실패한 아약스 요청하면 돌려 보냈다. 이것은 실제 다운 스트림 .fail() 핸들러에서 중요합니다.이 핸들러는 errorThrown을 읽을 때까지 발생한 Aijax 실패와 성공한 성공 조건을 모두 처리하지 않아도 처리해야합니다.

foo().fail(function(jqXHR, textStatus, errorThrown) { 
    if(errorThrown == 'Not YES') { 
     //transmogrified success 
     var data = textStatus; 
     ... 
    } 
    else { 
     //genuine ajax failure 
     ... 
    } 
}); 

이러한 방식보다는 jqXHR 객체로부터 다시 획득 data 합격 일반적으로 용이하다. 이는 JSON 인코딩 데이터에서 특히 그렇습니다. 그렇지 않으면 페일 처리기에서 두 번째로 디코딩해야합니다.

+2

나는 promise() 부분이 필요하다고 (또는 더 이상) 생각하지 않는다. 조금 덜 못생긴/longish. – mikus

관련 문제