当前位置: 首页 > 面试题库 >

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

罗学林
2023-03-14
问题内容

我试图使用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
});


 类似资料:
  • 问题内容: 目前,我在隐藏的输入字段中回显某些变量,并在需要时使用Javascript读取它们。 我和一个同事现在正在考虑使用PHP生成一个额外的Javascript文件,该文件仅包含Javascript的所有变量。这样,变量已经存在,HTML中没有多余的代码。 有什么好的方法可以将变量从PHP传递到Javascript?我们的解决方案听起来如何? 问题答案: 通用数据传递 JavaScript常

  • 问题内容: 至少有六打Django应用程序为Django提供OpenID身份验证: django-openid django-openid-auth 另一个django-openid-auth,似乎已经死了 django-authopenid django-socialauth(还提供对Twitter和Facebook帐户的身份验证) django-socialregistration(也具有Fa

  • 我正在AmazonEC2上运行docker-container。目前我已将AWS凭据添加到DockerFile。你能告诉我这样做的最好方法吗?

  • 问题内容: 在Java中,没有无符号字节之类的东西。 使用一些低级代码,有时您需要使用无符号值大于128的字节,由于MSB被用作符号,因此Java会将其解释为负数。 解决此问题的好方法是什么?(说不使用Java不是一种选择) 问题答案: 从数组读取任何单个值时,请将其复制到short或int之类的值中,然后将负数手动转换为正值。 写入数组时,可以执行类似的转换。

  • 问题内容: 我在Amazon EC2上运行docker-container。目前,我已将AWS凭证添加到Dockerfile中。您能告诉我最好的方法吗? 问题答案: 最好的方法是使用IAM角色,并且根本不处理凭据。(请参阅http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam- roles-for-amazon- ec2.html ) 可以从中

  • 问题内容: 我们希望将数据从服务器推送到客户端,但只能使用HTTP(端口80)。最佳的消息传递解决方案是什么?一种想法是彗星。是否还有其他想法或框架可以通过HTTP提供JMS。(是的,ActiveMQ也支持它,但是恕我直言。而且JXTA也支持它,但是配置很复杂。最好是简单的东西。) 问题答案: 由于许多原因,最简单的解决方案是使用基于Comet的方法(如您所述)。这意味着客户端(您要向其“推送”消