一尘不染

将已解决的承诺值向下传递到最终“ then”链的最佳方法是什么?

node.js

我试图使用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值。

最好的方法是什么?


阅读 262

收藏
2020-07-07

共1个答案

一尘不染

这些是您的许多选择中的一些:

在门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
});
2020-07-07