내가 더 설명하려고 노력하는 대답에 대한 두 번째 시도 :
먼저, RSVP README의 몇 가지 필수 배경 :
정말 멋진 부분은 첫 번째 핸들러에서 프라 미스를 반환 할 때 나옵니다. 이렇게하면 중첩 된 콜백을 평평하게 만들 수 있으며 많은 비동기 코드가있는 프로그램에서 "오른쪽 드리프트"를 방지하는 프라 미스의 주요 기능입니다.
이것이 바로 then
그 전에 끝나야 할 약속에서 나중 약속을 반환함으로써 순차적으로 약속을 만드는 방법 입니다.
이러한 일련의 약속을 트리로 생각하면 분기가 순차적 프로세스를 나타내고 잎이 동시 프로세스를 나타내는 트리라고 생각하면 도움이됩니다.
이러한 약속 트리를 구축하는 프로세스는 다른 종류의 트리를 구축하는 매우 일반적인 작업과 유사합니다. 트리에서 현재 분기를 추가하는 위치에 대한 포인터 또는 참조를 유지하고 반복적으로 항목을 추가합니다.
@Esailija가 그의 대답에서 지적했듯이 인수를 사용하지 않는 약속 반환 함수 배열이 있으면 reduce
트리를 깔끔하게 구축하는 데 사용할 수 있습니다. reduce를 직접 구현 한 적이 있다면 @Esailija의 답변에서 reduce가 수행하는 작업은 현재 약속 ( cur
)에 대한 참조를 유지하고 각 약속이 then
.
함수를 반환하는 것을 약속하는 동종의 좋은 배열이없는 경우 또는 단순한 선형 시퀀스보다 더 복잡한 구조가 필요한 경우 다음을 유지하여 약속 트리를 직접 구성 할 수 있습니다. 새 약속을 추가하려는 약속 트리의 위치에 대한 참조 :
var root_promise = current_promise = Ember.Deferred.create();
current_promise = current_promise.then(function(){
return
});
current_promise = current_promise.then(function(){
return
});
root_promise.resolve();
RSVP.all을 사용하여 약속 "분기"에 여러 "휴가"를 추가하여 동시 및 순차 프로세스의 조합을 작성할 수 있습니다. 너무 복잡하기 때문에 내 반대 투표가 그 예를 보여줍니다.
Ember.run.scheduleOnce ( 'afterRender')를 사용하여 다음 약속이 실행되기 전에 하나의 약속에서 수행 된 작업이 렌더링되도록 할 수 있습니다. 내가 너무 복잡하기 때문에 반대표를 던진 답변도 그 예를 보여줍니다.