Глядя на обработку промисов в этом блоге, я изменил пример отказа:
var myApp = angular.module('myApp',[]);
myApp.controller("MyCtrl", function ($q, $scope) {
(function() {
var deferred = $q.defer();
var promise = deferred.promise;
promise.then(function(result) {
console.log("success pass 1 - " + result);
return result;
}, function(reason) {
console.log("failure pass 1, reason:", reason);
throw new Error("failed with: " + reason);
}).
then(function(result) {
console.log("2nd success! result: ", result);
}, function(reason) {
console.log("2nd failure! reason: ", reason);
});
console.log("calling deferred.reject('bad luck')");
deferred.reject("bad luck");
})();
Для моей первой функции отказа я заметил, что замена throw
на return
приведет к:
calling deferred.reject('bad luck')
failure pass 1, reason: bad luck
2nd success! result: Error {stack: (...), message: "failed with: bad luck"}
В итоге я заменил return
на throw
для достижения нужного failure -> failure
результата.
calling deferred.reject('bad luck')
failure pass 1, reason: bad luck
Error: failed with: bad luck at ...app.js
2nd failure! reason: Error {stack: ... "failed with: bad luck"}
Выброшенная ошибка, похоже, не была обнаружена. Почему это? Разве внутренний сбой не должен был поймать эту выброшенную ошибку?
Кроме того, в связанном промисе может ли быть достигнут случай последовательной ошибки (в данном случае случай сбоя 2-го цепочного промиса) только через бросок Error
?