我正在尝试使用node.js中的Q模块来了解promises,但是我有一个小问题。
在这个例子中:
ModelA.create(/* params */)
.then(function(modelA){
return ModelB.create(/* params */);
})
.then(function(modelB){
return ModelC.create(/* params */);
})
.then(function(modelC){
// need to do stuff with modelA, modelB and modelC
})
.fail(/*do failure stuff*/);
.create方法在每个.then()中返回一个promise,正如预期的那样,获得promise的已解析值。
然而,在最后的.then()中,我需要拥有所有3个先前解决的promise值。
最好的方法是什么?
答案 0 :(得分:36)
这些是您的众多选择中的一部分:
在门1后面,使用reduce来累积结果。
var models = [];
[
function () {
return ModelA.create(/*...*/);
},
function () {
return ModelB.create(/*...*/);
},
function () {
return ModelC.create(/*...*/);
}
].reduce(function (ready, makeModel) {
return ready.then(function () {
return makeModel().then(function (model) {
models.push(model);
});
});
}, Q())
.catch(function (error) {
// handle errors
});
在门2后面,将累积的模型打包成一个数组,并用传播解压缩。
Q.try(function () {
return ModelA.create(/* params */)
})
.then(function(modelA){
return [modelA, ModelB.create(/* params */)];
})
.spread(function(modelA, modelB){
return [modelA, modelB, ModelC.create(/* params */)];
})
.spread(function(modelA, modelB, modelC){
// need to do stuff with modelA, modelB and modelC
})
.catch(/*do failure stuff*/);
在门3后面,捕获父范围内的结果:
var models [];
ModelA.create(/* params */)
.then(function(modelA){
models.push(modelA);
return ModelB.create(/* params */);
})
.then(function(modelB){
models.push(modelB);
return ModelC.create(/* params */);
})
.then(function(modelC){
models.push(modelC);
// need to do stuff with models
})
.catch(function (error) {
// handle error
});
答案 1 :(得分:23)
Bluebird promises库通过.bind()
为此提供了另一种解决方案。
看起来像这样:
ModelA.create(/* params */).bind({})
.then(function (modelA) {
this.modelA = modelA;
return ModelB.create(/* params */);
})
.then(function (modelB) {
this.modelB = modelB;
return ModelC.create(/* params */);
})
.then(function (modelC) {
// you have access to this.modelA, this.modelB and modelC;
});
documentation中有很多关于此方法的有趣信息。
答案 2 :(得分:3)
您可能不需要等到创建modelA才能创建modelB等等 如果是这样,那么您可以执行以下操作:
var promises = [
ModelA.create(...),
ModelB.create(...),
ModelC.create(...)
);
Q.all( promises ).spread(function( modelA, modelB, modelC ) {
// Do things with them!
}).fail(function() {
// Oh noes :(
});
这是做什么的:
spread()
中传递的函数。参数是声明顺序中每个promise的已解析值。我希望它可以帮助你:)