在$q服务中捕获拒绝而不触发成功回调
catch rejection in $q service without triggering success callbacks
我有一个返回$q
(Q)promise的方法:
var subtypesMetadataResolved = restService.getNodeSubtypesMetadata();
现在,当元数据可用时,我想运行两个函数来处理它们。首先,我想把它们像这样链起来:
subtypesMetadataResolved.then(createNodes).then(prepareDataForWidgets)
但后来我意识到,由于它们都需要subtypesMetadataResolved
承诺返回的数据,我也需要从createNodes
成功回调返回这些数据,以便将其传递到prepareDataForWidgets
,这不是一个选项。然后我做了这样的:
subtypesMetadataResolved.then(createNodes)
subtypesMetadataResolved.then(prepareDataForWidgets)
这就像我需要的一样。但现在的问题是,当subtypesMetadataResolved
被拒绝时,我如何调用我的rejection
回调,并且在这种情况下既不触发createNodes
也不触发prepareDataForWidgets
回调?我有以下内容,但在触发nodeSubtypesMetadataErrorCb
后,它也会触发createNodes
回调:
subtypesMetadataResolved.catch(nodeSubtypesMetadataErrorCb);
subtypesMetadataResolved.then(createNodes)
subtypesMetadataResolved.then(prepareDataForWidgets)
以下是我如何拒绝subtypesMetadataResolved
:
编辑:
function getNodeSubtypesMetadata(subtype) {
return $q.when("success!").then(function(){
debugger
throw new Error();
});
}
var subtypesMetadataResolved = getNodeSubtypesMetadata();
subtypesMetadataResolved.then(successCb1);
subtypesMetadataResolved.then(successCb2);
subtypesMetadataResolved.catch(nodeSubtypesMetadataErrorCb);
$q.all([
typesMetadataResolved,
subtypesMetadataResolved
]).then(init);
问题是,您正在将带有已处理错误的promise分配给subtypesMetadataResolved
。如果对此调用.then()
,则将调用then()
回调,因为.catch()
回调本质上是在"处理"错误。
要解决此问题,请将未处理的承诺分配给变量,然后在此调用.catch()
/.then()
:
var subtypesMetadataResolved = getNodeSubtypesMetadata();
subtypesMetadataResolved.catch(nodeSubtypesMetadataErrorCb);
subtypesMetadataResolved.then(function(){
debugger
});
subtypesMetadataResolved.then(function () {
debugger
});
就风格而言,我建议将catch
行放在then
行之后,但这对代码的行为没有明显的影响。
查看这行代码:
getNodeSubtypesMetadata().catch(nodeSubtypesMetadataErrorCb)
有两个承诺。第一个是getNodeSubtypesMetadata()
返回的promise,被拒绝。第二个承诺由catch(nodeSubtypesMetadataErrorCb)
返回,并已实现。因此,当您将上述表达式的结果分配给一个变量时,您得到的是第二个已实现的promise。由于您有兴趣执行第一个承诺,您需要将代码更改为:
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);
- 成功回调永远不会被JSONP请求调用
- 查询后websql成功回调无法访问变量
- 在$q服务中捕获拒绝而不触发成功回调
- 如何从ajax成功回调函数中读取javascript变量
- bookmarklet中的jQuery.getScript()进行回调,但没有成功执行插件
- $http服务未触发成功或错误回调
- 在AJAX中使用window.location.replace'成功'回调
- AJAX成功回调-执行javascript时出现问题
- 当使用命名函数作为jquery ajax成功回调时,我需要括号吗
- jQuery$.post可以在chrome、safari中工作,但不能在FF中工作(声明成功回调函数未定义)
- Yii ajaxbutton : 如何在成功回调函数中获取 $(this)
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- 解析查询.首次成功/错误 间歇性不调用回调
- 承诺中的成功回调不会发生$http
- AJAX内部回调成功
- AJAX 的回调(成功?)函数
- 流星:从服务器回调成功后写入数据库
- 回调成功后,不能将字符串推入数组
- Ajax, post数据但不回调成功
- 如何使循环等待回调成功