2014-04-22 3 views
3

순차적으로 실행해야하는 두 개의 비동기 함수 (두 번째 것은 첫 번째 결과에 따라 다름)가 있고 일단 실행되면 두 함수의 결과를 사용해야합니다. 는 "고전"콜백 기반 패턴에서, 그 꽤 쉽게 :이 사용 Q 약속을 다시하기 위해 노력하고있어Q chaining 여러 결과 값 가져 오기

http://jsfiddle.net/D6m8V/

function getOriginalString(callback) { 
    callback("An original string"); 
} 

function uppercase(x, callback) { 
    callback(x.toUpperCase()); 
} 

getOriginalString(function(orig) { 
    uppercase(orig, function(upper) { 
     console.log(orig, upper); //Access to both results 
    }); 
}); 

. 여기에 내가 가진 무엇 :

http://jsfiddle.net/3x6v3/2/

function getOriginalString() { 
    var deferred = Q.defer(); 
    deferred.resolve("An original string"); 
    return deferred.promise; 
} 

function uppercase(x) { 
    var deferred = Q.defer(); 
    deferred.resolve(x.toUpperCase()); 
    return deferred.promise; 
} 

getOriginalString() 
.then(uppercase) 
.then(function(result) { 
    console.log(result);  
}) 
.done(); 

문제는 내가 마지막 함수 호출, uppercase의 결과에 액세스 할 수 있습니다. 콜백 기반 예제와 같이 두 함수의 결과에 액세스 할 수 있어야합니다.

약속을 통해이를 수행하는 적절한 방법은 무엇입니까?

답변

4

하나의 옵션은 여전히 ​​중첩과 (콜백 버전과 같은 폐쇄를 사용

getOriginalString().then(function(orig){ 
    return Q.all([orig,uppercase(x)]); 
}).spread(function(orig,upper){ 
    console.log(orig,upper); 
}); 

당신은 과정의 수 (블루 버드 같은 ES6의 약속과 다른 도서관에 Promise.all) Q.all를 사용하는, 또는 것 외부 범위).

또한 I/O 또는 비동기 호출을 수행하지 않는 기능을 약속 할 필요가 없습니다.

+0

@ barry-johnson이 솔루션에 대해 순차적이지 않은 것은 무엇입니까? –

+0

당신은 정확합니다 - 나는 방금 Q.all()을 읽었지 만 네가 여기서 사용하는 방식대로 작동합니다. –

+0

네, 제 실제 함수는 실제로 비동기입니다. –