Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Q承诺链接可以获得多个结果值_Javascript_Node.js_Promise_Q - Fatal编程技术网

Javascript Q承诺链接可以获得多个结果值

Javascript Q承诺链接可以获得多个结果值,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,我有两个异步函数需要顺序执行(第二个函数取决于第一个函数的结果),一旦它们执行完毕,我需要使用这两个函数的结果。在基于“经典”回调的模式中,这非常简单: 我正试图用Q承诺重做这件事。以下是我得到的: 问题是我只能访问上一次函数调用的结果,uppercase。我需要访问这两个函数的结果,就像在基于回调的示例中一样 使用promises的正确方法是什么?一个选项是使用Q.all(ES6 promises和其他库(如Bluebird)中的Promise.all) 当然,您仍然可以使用类似回调版本的

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

我正试图用Q承诺重做这件事。以下是我得到的:

问题是我只能访问上一次函数调用的结果,
uppercase
。我需要访问这两个函数的结果,就像在基于回调的示例中一样


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

一个选项是使用Q.all(ES6 promises和其他库(如Bluebird)中的Promise.all)

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


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

@barry johnson此解决方案有什么不连续的地方?您是对的-我只是阅读了Q.all(),但是是的,您在这里使用它的方式是可行的。是的,我的实际函数确实是异步的。这在我看来有点奇怪,我将使用外部作用域闭包,这基本上与回调没有什么不同,但是嘿。至少我在用承诺!谢谢
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
    });
});
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();
getOriginalString().then(function(orig){
    return Q.all([orig,uppercase(x)]);
}).spread(function(orig,upper){
    console.log(orig,upper);
});