Предположим, что функция возвращает пользовательское обещание.В этом примере давайте предположим, что требуется пользовательское обещание:
(Примечание: среда AngularJS [т.е. 1.x], которая выполняет ES5)
function doMyFunction() {
var d = $q.defer();
do1()
.then (function () { return do2(); }) //P1
.then (function () { return do3(); }) // P2
.then {function () {console.log ("All good"); d.resolve(true); return d.promise;}) // P3
.catch (function () {
console.log ("Oh no");
fallback1()
.then (function () {
console.log ("Ah this fallback1 worked");
d.resolve(true);
return d.promise;
}, function () {
console.log ("Oh no, fallback failed, do I have to go through nested hell to now try fallback 2?");
d.resolve(false);
return d.promise;
});
return d.promise;
}
Как описано выше, я пытаюсь попробовать разные подходы по очереди, только если первый подход потерпит неудачу.
Если я попытаюсь сгладить это так:
// lets start from the last promise above
.then {function () {console.log ("All good"); d.resolve(true); return d.promise;}) // P3
.catch (function () { return fallback1(); })
.then (function () { d.resolve(true); return d.promise; }) // P4
.catch (function () {})
Это на самом деле не работает, потому что P4 выполняется, когда P3 также успешен.
Что такоехороший подход для обработки случая, когда мне нужно попробовать несколько функций, основанных на обещаниях, последовательно и только в случае сбоя предыдущей?
Кроме того, я не уверен, смогу ли я действительно выполнить .then().catch().then().catch()
Есть ли чистый подход, чтобы избежать гнезда ада в таких ситуациях?