在$ q服务中捕获拒绝而不触发成功回调

时间:2015-04-01 15:39:34

标签: javascript q

我有一个返回$qQ)承诺的方法:

var subtypesMetadataResolved = restService.getNodeSubtypesMetadata();

现在,当元数据可用时,我想运行两个函数来处理它们。首先,我想把它们链接起来:

subtypesMetadataResolved.then(createNodes).then(prepareDataForWidgets)

但后来我意识到,由于它们都需要subtypesMetadataResolved承诺返回的数据,我还需要从createNodes成功回调中返回这些数据,以便将其传递给{ {1}},这不是一个选项。那么我就这样做了:

prepareDataForWidgets

哪个像我需要的那样工作。但现在问题是如何在subtypesMetadataResolved.then(createNodes) subtypesMetadataResolved.then(prepareDataForWidgets) 被拒绝时调用我的rejection回调,并且在这种情况下不会同时触发subtypesMetadataResolvedcreateNodes回调?我有以下内容,但在触发prepareDataForWidgets后,它还会触发nodeSubtypesMetadataErrorCb回调:

createNodes

以下是我拒绝subtypesMetadataResolved.catch(nodeSubtypesMetadataErrorCb); subtypesMetadataResolved.then(createNodes) subtypesMetadataResolved.then(prepareDataForWidgets) 的方式:

修改

subtypesMetadataResolved

2 个答案:

答案 0 :(得分:1)

问题是您要将已处理错误的承诺分配给subtypesMetadataResolved。如果您对此致电.then(),则调用then()回调,因为.catch()回调基本上是“处理”错误。

要解决此问题,请将未处理的承诺分配给您的变量,然后在其上调用.catch() / .then()

var subtypesMetadataResolved = getNodeSubtypesMetadata();

subtypesMetadataResolved.catch(nodeSubtypesMetadataErrorCb);
subtypesMetadataResolved.then(function(){
    debugger
});
subtypesMetadataResolved.then(function () {
    debugger
});

作为一种风格问题,我建议将catch行放在then行之后,但这对代码的行为没有任何可观察到的影响。

答案 1 :(得分:1)

看看这行代码:

getNodeSubtypesMetadata().catch(nodeSubtypesMetadataErrorCb)

有两个承诺。第一个是getNodeSubtypesMetadata()返回的承诺,被拒绝。第二个承诺由catch(nodeSubtypesMetadataErrorCb)返回,该承诺已完成。因此,当您将上述表达式的结果分配给变量时,您将获得第二个履行承诺。由于您有兴趣对第一个承诺采取行动,因此您需要将代码更改为:

var subtypesMetadataResolved = getNodeSubtypesMetadata();
subtypesMetadataResolved.catch(nodeSubtypesMetadataErrorCb);
subtypesMetadataResolved.then(function(){
    debugger
});
subtypesMetadataResolved.then(function () {
    debugger
});

编辑:作为替代方案,要让两个函数同时执行相同的承诺,您可以使用单个函数包装它们:

function nodeSubtypesMetadataFulfilledCb(metadata) {
    createNodes(metadata);
    prepareDataForWidgets(metadata);
}

subtypesMetadataResolved.then(
    nodeSubtypesMetadataFulfilledCb,
    nodeSubtypesMetadataErrorCb);