我有一个返回$q
(Q)承诺的方法:
var subtypesMetadataResolved = restService.getNodeSubtypesMetadata();
现在,当元数据可用时,我想运行两个函数来处理它们。首先,我想把它们链接起来:
subtypesMetadataResolved.then(createNodes).then(prepareDataForWidgets)
但后来我意识到,由于它们都需要subtypesMetadataResolved
承诺返回的数据,我还需要从createNodes
成功回调中返回这些数据,以便将其传递给{ {1}},这不是一个选项。那么我就这样做了:
prepareDataForWidgets
哪个像我需要的那样工作。但现在问题是如何在subtypesMetadataResolved.then(createNodes)
subtypesMetadataResolved.then(prepareDataForWidgets)
被拒绝时调用我的rejection
回调,并且在这种情况下不会同时触发subtypesMetadataResolved
或createNodes
回调?我有以下内容,但在触发prepareDataForWidgets
后,它还会触发nodeSubtypesMetadataErrorCb
回调:
createNodes
以下是我拒绝subtypesMetadataResolved.catch(nodeSubtypesMetadataErrorCb);
subtypesMetadataResolved.then(createNodes)
subtypesMetadataResolved.then(prepareDataForWidgets)
的方式:
修改
subtypesMetadataResolved
答案 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);