【问题标题】:Q promises chaining get multiple result values [duplicate]Q承诺链接获得多个结果值[重复]
【发布时间】:2014-04-23 05:14:57
【问题描述】:

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

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 承诺重做这个。这是我得到的:

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。我需要访问这两个函数的结果,就像在基于回调的示例中一样。

使用 Promise 的正确方法是什么?

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

    一种选择是使用 Q.all(ES6 Promise 中的 Promise.all 和 Bluebird 等其他库)

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

    当然,您仍然可以使用像回调版本这样的闭包(带有嵌套或外部作用域)。

    另外,为了确保您不需要承诺任何不进行 I/O 或其他异步调用的函数。

    【讨论】:

    • @barry-johnson 这个解决方案有什么不连续的?
    • 你是对的 - 我刚刚阅读了 Q.all(),但是是的,你在这里使用它的方式会起作用。
    • 是的,我的实际函数确实是异步的。
    • 这对我来说有点奇怪,我将使用外部作用域闭包,这基本上与回调没有什么不同,但是嘿。至少我正在使用承诺!谢谢
    猜你喜欢
    • 2015-04-15
    • 2017-10-18
    • 2015-02-04
    • 2017-11-29
    • 1970-01-01
    • 2017-11-28
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多