2013-07-30 4 views
1

나는 현재 다음과 같이 기능을 많이 가지고 있어요. 그런 다음 텍스트가 다른 약속을 반환하는 LoadFromText 함수에 전달됩니다. 이것이 성공하면 외부 지연이 해결됩니다. URL을로드 할 수 없거나 LoadFromText 함수가 실패하면 외부 지연이 거부됩니다. 체인 연결 deferreds는

인가가 나는/거부 결의의 결과를 체인이 같은 끝낼 수있는 방법이 허용 약속의 일부 구현을 본 적이

function LoadFromURL(url) 
{ 
    return $.get(url).then(function(text) 
    { 
     return LoadFromText(text); 
    }, 
    function(err) 
    { 
     return $.Deferred().reject(err); 
    }).promise(); 
} 

- 내 약속을 반환 'then'은 약속의 최종 결과가 사용됨을 의미합니다.

나는 이것이 지금은 효과가 없다는 것을 깨닫는다. (결과는 약속의 결과 라기보다는 약속이다.) 누군가가이 일을 할 수있는 길을 제안 할 수 있기 때문에 때로는 혼란스런 혼란을 정리할 수있다. 첫 번째 예제의.

나는 이것이 의미가 있기를 바랍니다. 감사. 로 단순화

+0

jQuery의 Deferred의'then' 메소드는 내가 사용한 다른 약속 라이브러리와 약간 다릅니다. 더 필터로 사용하기위한 것입니다. (물론 원하는대로 사용할 수 있습니다.) 대신'.when()'을보세요. 그것이 당신이 찾고있는 것을하지 않는다면, 첫 번째 코드 블록은 내가이 문제에 관해서 생각하는 것처럼 보입니다. 또는 Async.js 또는 무언가를 포함하십시오. – Brad

답변

0

LoadFromURL은 다음과 같습니다

function LoadFromURL(url) { 
    return $.get(url).then(function(text) { 
     return LoadFromText(text); 
    }); 
} 

원래 버전처럼

이 프로세스가 서버가 반환 될 때까지 무기한 재귀 경향이 당신이 생각하지 않은 문제 ...가있을 수 있습니다 HTTP 오류. 서버 리소스를 적절하게 작성하는 데 약간의 어려움이있을 수 있습니다. 특히 가능성이 높으면 최종적으로 제공되는 텍스트에 액세스해야합니다.

좀 더 생각해 보면 "계속"또는 "완료"가 텍스트 자체 또는 HTTP 응답 코드에 표시되는 방식으로 모든 텍스트를 제공 할 수 있습니다. 예를 들어 응답 코드 202 ("Accepted")를 사용하여 프로세스가 완료되지 않았 음을 나타낼 수 있습니다.

나는이 (1.5 jQuery를 함께) 작동합니다 생각 :

function LoadFromURL(url) { 
    return $.get(url).then(function(text, textStatus, jqXHR) { 
     if(jqXHR.status === 202) {//continue 
      return LoadFromText(text); 
     } 
     else {//complete 
      return text; 
     } 
    }); 
} 

당신은 단지 서버가 "계속"또는 "전체"에 대한 200 (202)을 반환을 준비해야합니다.

LoadFromURL('my/resource').then(function(text) { 
    console.log("After a series of $.get requests, the finally delivered text was:\n" + text); 
}); 
+0

첫 번째 예제를 잘못 이해 했어야합니다. 결국 내가 예상했던 방식대로 작동하기 때문입니다. 감사. – Barguast

0

내가 두 번째 기능 LoadFromText 나를 위해 블랙 박스의 일종이기 때문에 내가 제대로 이해 있는지 확실하지 않습니다 다음과 같이

따라서, LoadFromURL()가 호출 될 수있다. 나는 생각하기에, 당신의 구성이 너무 처량하여 사형을 당했다고 생각합니다. 덜하는 많은 기능에서 해보십시오.

function Load() { 
    var myUrl = '//path.to/url'; 
    LoadFromUrl(myUrl) 
     .then(LoadFromText, errorHandler) 
     .then(successHandler, errorHandler); 
} 

function successHandler(returnedData) { 
    console.log('Requests were successful: ' + returnedData); 
} 

function errorHandler(err) { 
    console.log('An error occurded: ' + err); 
} 

function LoadFromURL(url) { 
    return $.get(url); 
} 

function LoadFromText(text) { 
    // THIS IS SOME SORT OF BLACK BOX FOR ME... 
    // SEEMS TO RETURN A PROMISE, THOUGH 

    var $deferred = $.Deferred(); 

    // DO THE LOGIC TO EITHER REJECT OR RESOLVE THE PROMISE 

    return $deferred.promise(); 
} 

당신은 아약스 체인을 시작하는 주요 기능 Load를 사용 : 나는 제안을했습니다. 첫 번째 아약스 요청이 완료되면 두 번째 요청은 첫 번째 요청의 데이터로 시작됩니다. 그 후에 successHandler는 두 번째 아약스 호출의 데이터에 필요한 모든 작업을 수행합니다. 이는 솔루션에 중요한 추가 사항입니다.
기본적으로 당신이 한 것과 똑같은 일이지만 유지 보수가 쉬운 작은 기능으로 배포됩니다.

1

내가 결과

예를 체인 수있는 방법, 즉 then의 기본 동작이입니다!

function LoadFromURL(url) { 
    return $.get(url).then(LoadFromText); 
} 

내가이 허용 약속의 일부 구현 본 적이 - '다음'내 약속을 반환을 약속의 최종 결과가 사용되는 것을 의미한다.

jQuery 은 버전 1.8부터이 동작을 지원합니다. 1.5 ~ 1.7의 경우 .pipe을 사용할 수 있습니다.