我试图使用node.js中的Q模块来兑现承诺,但是我有一个小问题。
在此示例中:
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值。
最好的方法是什么?
这些是您的许多选择中的一些:
在门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 });