【发布时间】:2018-05-31 15:10:08
【问题描述】:
假设一个函数返回一个自定义的 Promise。为了这个例子,我们假设需要一个自定义的 Promise:
(注意:环境是执行 ES5 的 AngularJS [即 1.x])
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 成功时执行。
当我需要按顺序尝试多个基于 Promise 的函数并且仅当前一个函数失败时,有什么好的方法可以处理这种情况?
另外,我不确定我是否真的可以做到.then().catch().then().catch()
有没有一种干净的方法可以避免在这种情况下嵌套地狱?
【问题讨论】:
标签: javascript angularjs angular-promise