Javascript Angularjs承诺拒绝链
我需要创建连锁承诺:Javascript Angularjs承诺拒绝链,javascript,angularjs,promise,Javascript,Angularjs,Promise,我需要创建连锁承诺: var deferred = $q.defer(); $timeout(function() { deferred.reject({result: 'errror'}); }, 3000); deferred.promise.then(angular.noop, function errorHandler(result) { //some actions return result; }).then(function successCallback(
var deferred = $q.defer();
$timeout(function() {
deferred.reject({result: 'errror'});
}, 3000);
deferred.promise.then(angular.noop, function errorHandler(result) {
//some actions
return result;
}).then(function successCallback(result) {
console.log('what do I do here?');
return result;
}, function errorCallback(result) {
$scope.result= result;
return result;
});
如果我将errorCallback放入第一个然后
,则第二个然后
将被解析并调用其successCallback。但如果我删除了errorHandler
,那么第二个承诺将被拒绝
根据Angular JS文档,传播拒绝的唯一方法是返回$q.reject()
而且它看起来不明显,特别是因为我必须注入$q
服务,即使它不是必需的
也可以通过在errorHandler
中抛出异常来完成,但它会将异常跟踪写入控制台,这并不好
有没有另一种方法可以明确地做到这一点?原因是什么?为什么要这样做?在哪种情况下,当前行为可能有用
以及为什么会这样做。在哪种情况下,当前行为可能有用
当您在errorHandler中尝试修复错误状态并以某种方式解决承诺时,它会很有用
var retriesCount = 0;
function doWork()
{
return $http.post('url')
.then(function(response){
// check success-property of returned data
if(response.data.success)
// just unwrap data from response, may be do some other manipulations
return response.data;
else
// reject with error
return $q.reject('some error occured');
})
.catch(function(reason){
if(retriesCount++ < 3)
// some error, let me try to recover myself once again
return doWork();
else
// mission failed... finally reject
return $q.reject(reason);
});
}
doWork().then(console.log, console.error);
var retriescont=0;
函数doWork()
{
返回$http.post('url')
.然后(功能(响应){
//检查返回数据的success属性
if(response.data.success)
//只需从响应中展开数据,就可以执行其他操作
返回响应数据;
其他的
//错误地拒绝
返回$q.reject('发生了一些错误');
})
.catch(函数(原因){
如果(检索NT++<3)
//一些错误,让我再次尝试恢复自我
返回定位销();
其他的
//任务失败…最终被拒绝
返回$q.拒绝(原因);
});
}
doWork().then(console.log,console.error);
晚会迟到了,但因为我在这里
我更喜欢将$http
错误用于其本机错误处理,而不是通过200
和响应中的错误状态返回成功
在控制台中打印400
或500
错误不是问题,如果正在调试,则会看到错误,如果没有,则不会
angular.module('workModule', [])
// work provider handles all api calls to get work
.service('workProvider', ['$http', '$q', function($http, $q) {
var endpoint = '/api/v1/work/';
this.Get = function(){
// return the promise, and use 404, 500, etc for errors on the server
return $http.get(endpoint);
};
}])
.controller('workController', ['workProvider', function('workProvider'){
workProvider.Get().then(
function(response){ // success
console.log(response.data);
},
function(response){ // error
console.log(response.data);
}
)
}])
同意-如果操作成功,服务器应仅返回200。这会影响系统监视和日志记录(错误在200个响应中被掩盖)。例外情况是数据验证(如果它是一个有效的用户流,可以返回到客户端,以发送关于如何修复的错误数据和响应)。我在服务中有以下内容:
return$http.get(endpoint)。然后(函数(response){return response.data;},函数(error){return error.data;})
但当发生错误时,数据会传递给successCallback(then()中的第一个函数),而不是errorCallback(then()中的第二个函数)。我尝试返回$q.reject(error.data)而不是返回error.data,但不起作用。为什么会发生这种情况?@AlejandroSanzDíaz“错误”发生在哪里?这是回应吗?如果是,您的“错误”响应代码是什么。200=成功,4XX或5XX将导致错误。还要检查文档是否尝试不使用然后而使用成功和错误回调。如果是这种情况,我将进行编辑。我最终使用return$q.reject(error.data)解决了这个问题代码>内部错误回调函数。:)无论如何,谢谢。注意:您可以使用.catch(function(){})
而不是。然后(null,function(){})
我投了赞成票,但我同意@Dinistro,您需要在这里输入正确的语法,并在.catch方法中捕获拒绝承诺。这是处理拒绝承诺的最有效的方法。