假设我有 4 个功能:runA()
, runB()
, runC()
and runD()
.
使用 ES6 Promise,在一次完全成功的运行中,这些都将依次运行:
runA()
.then(runB)
.then(runC)
.then(runD)
If runA
or runB
失败(拒绝或抛出),我想打电话error1()
然后完全停止链(不调用runC
or runD
)。这让我觉得我应该添加一个.catch()
在最后.then
承诺链:
runA()
.then(runB)
.then(runC) //won't get called if runA or runB throws
.then(runD) //won't get called if runA or runB throws
.catch(error1)
But if runC
失败了,我想打电话error2()
并且仍然停止链(不调用runD
).
runA()
.then(runB)
.catch(error1) //moved up to only handle runA and runB
.then(runC) //but now this gets called after error1() is run
.then(runD)
.catch(error2)
现在我有 2catch
链中的调用,runC
之后会接到电话error1
运行,因为 catch 的结果将默认为resolve
。是我唯一的选择error1
函数创建一个它总是拒绝的承诺?
不,有error1
创造一个总是拒绝的承诺,是not你唯一的选择。
您可以利用以下事实:.then
有两个参数:
.then(onSuccess, onFailure)
当给出两个参数时,会产生一个被低估的效果:onFailure
will not捕获失败onSuccess
。这通常是不可取的,但在这里除外,您可以使用这个事实来分支您的决策树:
runA()
.then(runB)
.then(() => runC().then(runD), error1)
.catch(error2)
这就是你想要的。
- if
runA
or runB
失败,那么error1
被调用并且链停止。
- if
runC
or runD
失败,那么error2
被调用并且链停止。
你也可以这样写:
runA()
.then(runB)
.then(() => runC()
.then(runD)
.catch(error2),
error1)
var log = msg => div.innerHTML += "<br>" + msg;
// Change which one of these four rejects, to see behavior:
var runA = () => Promise.resolve().then(() => log("a"));
var runB = () => Promise.reject().then(() => log("b"));
var runC = () => Promise.resolve().then(() => log("c"));
var runD = () => Promise.resolve().then(() => log("d"));
var error1 = () => log("error1");
var error2 = () => log("error2");
runA()
.then(runB)
.then(() => runC().then(runD), error1)
.catch(error2)
<div id="div"></div>
尝试修改其中失败的一个这把小提琴.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)