$q.reject 和处理 AngularJS 链式承诺中的错误
$q.reject and handling errors in AngularJS chained promises
我无法理解使用链接承诺进行错误处理的基本概念。
为了学习规则,我写了一个简单的例子,猜猜结果会是什么。但不幸的是,它的行为并不像我想象的那样。
我已经阅读了多篇有关该主题的文章,但由于我的英语水平很差,我可能无法获得详细信息。
无论如何,这是我的代码:
var promiseStart = $q.when("start");
var promise1 = promiseStart.then(function() {
return Serviceforpromise1.get();
});
var promise2 = promise1.then(function(data1)
{
return Serviceforpromise2.get(data1);
},function(error)
{
return $q.reject();
});
var promiseend = promise2.then(function(data2)
{
return data2;
},function(error)
{
return error;
});
return promiseend;
好吧,我知道可以更好地编码,但这只是为了这个目的。
这是 Serviceforpromise1 函数的代码:
function Serviceforpromise1()
{
...
return $http.get(*whatever*).then(function (data){
return data;
},function(error)
{
return $q.reject();
});
}
只考虑Serviceforpromise1失败的情况。 $q.reject 被发送回主链,所以我正在等待“promise1 .then(”的错误回调到被调用并且它按预期工作。我决定示例将错误转移到“promise2 .then”所以在这个错误回调中我添加了行return$q.reject();
但它从未到达第二个错误回调(“promise2 .then”)我不明白为什么(像 Serviceforpromise1,我 return 拒绝了承诺!)
我很乐意深入了解这里发生的事情。
感谢您的帮助。
您的理解是正确的,问题似乎出在您尝试观察此行为的方式中(在您未向我们展示的内容中)。
如果您 return 来自 的被拒绝的承诺 then()
中的成功或错误处理程序,则 return 由 then()
将解决被拒绝的承诺。观察:
angular.module('app', [])
.controller('C', [
'$q',
function ($q) {
var promiseStart = $q.when("start");
var promise1 = promiseStart.then(function (value) {
console.log('Got a value:', value);
return $q.reject('Error!');
});
var promise2 = promise1.then(function (data1) {
return "Got some stuff";
}, function (error) {
console.log("Caught an error:", error);
return $q.reject('New error');
});
var promiseend = promise2.then(function (data2) {
return data2;
}, function (error) {
console.log('Caught an error:', error); // <-- this is logged to the console
return error;
});
return promiseend;
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular.min.js"></script>
<div ng-app='app' ng-controller='C'></div>
这里要注意的一件事是,在最后一个处理程序中,您 returning error
变量,而不是抛出异常或 return拒绝承诺。因此,在这种情况下,promiseend
将 成功地 解析为 error
变量的值。
我无法理解使用链接承诺进行错误处理的基本概念。 为了学习规则,我写了一个简单的例子,猜猜结果会是什么。但不幸的是,它的行为并不像我想象的那样。 我已经阅读了多篇有关该主题的文章,但由于我的英语水平很差,我可能无法获得详细信息。
无论如何,这是我的代码:
var promiseStart = $q.when("start");
var promise1 = promiseStart.then(function() {
return Serviceforpromise1.get();
});
var promise2 = promise1.then(function(data1)
{
return Serviceforpromise2.get(data1);
},function(error)
{
return $q.reject();
});
var promiseend = promise2.then(function(data2)
{
return data2;
},function(error)
{
return error;
});
return promiseend;
好吧,我知道可以更好地编码,但这只是为了这个目的。 这是 Serviceforpromise1 函数的代码:
function Serviceforpromise1()
{
...
return $http.get(*whatever*).then(function (data){
return data;
},function(error)
{
return $q.reject();
});
}
只考虑Serviceforpromise1失败的情况。 $q.reject 被发送回主链,所以我正在等待“promise1 .then(”的错误回调到被调用并且它按预期工作。我决定示例将错误转移到“promise2 .then”所以在这个错误回调中我添加了行return$q.reject(); 但它从未到达第二个错误回调(“promise2 .then”)我不明白为什么(像 Serviceforpromise1,我 return 拒绝了承诺!)
我很乐意深入了解这里发生的事情。 感谢您的帮助。
您的理解是正确的,问题似乎出在您尝试观察此行为的方式中(在您未向我们展示的内容中)。
如果您 return 来自 的被拒绝的承诺 then()
中的成功或错误处理程序,则 return 由 then()
将解决被拒绝的承诺。观察:
angular.module('app', [])
.controller('C', [
'$q',
function ($q) {
var promiseStart = $q.when("start");
var promise1 = promiseStart.then(function (value) {
console.log('Got a value:', value);
return $q.reject('Error!');
});
var promise2 = promise1.then(function (data1) {
return "Got some stuff";
}, function (error) {
console.log("Caught an error:", error);
return $q.reject('New error');
});
var promiseend = promise2.then(function (data2) {
return data2;
}, function (error) {
console.log('Caught an error:', error); // <-- this is logged to the console
return error;
});
return promiseend;
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.10/angular.min.js"></script>
<div ng-app='app' ng-controller='C'></div>
这里要注意的一件事是,在最后一个处理程序中,您 returning error
变量,而不是抛出异常或 return拒绝承诺。因此,在这种情况下,promiseend
将 成功地 解析为 error
变量的值。