在Angular.js中使用$ q时,为什么不使用此代码:
$q.when("test")
.then($q.reject("error"))
.then(
function(v) {
$scope.result = "Success: " + v;
},
function(e) {
$scope.result = "Failure: " + e;
}
)
调用错误回调?
在jsfiddle中:http://jsfiddle.net/c9tv6kz7/1/
答案 0 :(得分:3)
然后(successCallback,errorCallback,notifyCallback) - 无论如何 当承诺已经或将要解决或拒绝时,请拨打一个 成功或错误回调一旦结果异步 是可用的。使用单个参数调用回调: 结果或拒绝原因。另外,通知回调可能是 在之前调用零次或多次以提供进度指示 承诺得到解决或拒绝。
此方法返回通过解析或拒绝的新承诺 successCallback的返回值,errorCallback(除非那个 value是一个promise,在这种情况下,它用值来解析 使用promise chaining解决了这个承诺。它也通知 通过notifyCallback方法的返回值。承诺不能 从notifyCallback方法中解析或拒绝。
我们真正关心的是
此方法返回通过解析或拒绝的新承诺 successCallback的返回值,errorCallback
每次在then
上致电$q.when
,您都会创建新承诺。即使第一个承诺被拒绝,第二个承诺也没有。第二个没有被拒绝,因为successCallback和errorCallback的返回值没有拒绝它。
答案 1 :(得分:2)
更简单的答案是:
$q.reject("error")
创建一个新的promise对象,由$q.when().then()
。
这真的不符合你的想法。 $q.reject("error")
返回一个带有then
函数的对象。
请查看docs中的方法部分:
promiseB = promiseA.then(function(result) {
// success: do something and resolve promiseB
// with the old or a new result
return result;
}, function(reason) {
// error: handle the error if possible and
// resolve promiseB with newPromiseOrValue,
// otherwise forward the rejection to promiseB
if (canHandle(reason)) {
// handle the error and recover
return newPromiseOrValue;
}
return $q.reject(reason);
});
你是否看到他们的行为then(function () { return $q.reject(reason); })
与原作有很大不同。
查看新的fiddle
答案 2 :(得分:0)
当我这样做时,我解决了一个错误:
var myApp = angular.module('myApp', []);
myApp.controller('MyCtrl', ['$scope', '$q', function($scope, $q) {
$q.when("test")
$q.reject('Failed!')
.then(
function(v) {
$scope.result = "Success: " + v;
},
function(e) {
$scope.result = "Failure: " + e;
}
)
}]);
http://jsfiddle.net/emporio/67db45f9/3/
如果我删除$q.reject('Failed!')
,它将解析为.then()。