Q promises chaining获得多个结果值

时间:2014-04-22 21:12:07

标签: javascript node.js promise q

我有两个需要顺序执行的异步函数(第二个取决于第一个结果),一旦执行,我需要使用两个函数的结果。在“经典”基于回调的模式中,这非常简单:

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
    });
});

我正在尝试使用Q promises重做这个。这就是我得到的:

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的结果。我需要访问这两个函数的结果,比如基于回调的示例。

用承诺做这件事的正确方法是什么?

1 个答案:

答案 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或其他异步呼叫的功能。