我有两个需要顺序执行的异步函数(第二个取决于第一个结果),一旦执行,我需要使用两个函数的结果。在“经典”基于回调的模式中,这非常简单:
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
});
});
我正在尝试使用Q promises重做这个。这就是我得到的:
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
的结果。我需要访问这两个函数的结果,比如基于回调的示例。
用承诺做这件事的正确方法是什么?
答案 0 :(得分:4)
一种选择是使用Q.all(ES6承诺中的Promise.all和Bluebird等其他库)
getOriginalString().then(function(orig){
return Q.all([orig,uppercase(x)]);
}).spread(function(orig,upper){
console.log(orig,upper);
});
当然,您仍然可以使用类似回调版本的闭包(使用嵌套或外部作用域)。
另外,为了确保,您不需要宣传任何不进行I / O或其他异步呼叫的功能。