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