[英]Handling errors in promise chains
在承诺链中可能会发生两类错误。
.catch
处理) 我的问题是如何最好地应对后者。
例如,下面的.catch
不会捕获foo
有机会返回诺言之前抛出的异常。
function go() {
return foo()
.then(bar)
.catch(bam);
}
显然,我可以将go
的内容包装在try-catch
块中。
但是,从foo
的catch块返回立即被拒绝的诺言以“维护API”并为所有可能的事件提供基于诺言的接口会更好吗?
或者,您可以在链中包括foo
,如下所示
Promise.resolve()
.then(foo)
.then(bar)
.catch(bam);
现在,即使foo
抛出了, bam
也会照顾它。
或者,在foo
构建包装器,
function promiseWrapper(func) {
try {
return Promise.resolve(func());
} catch (e) {
return Promise.reject(e);
}
}
然后使用它,而不是foo
,就像这样
function go() {
return promiseWrapper(foo)
.then(bar)
.catch(bam);
}
或者,您可以更明确地执行以下操作:
function foo() {
try {
// some staff which should return promise
}
catch(e) {
retrun Propmise.reject('the reason');
}
}
然后使用
function go() {
return foo()
.then(bar)
.catch(bam);
}
现在,您无需更改foo
所有用法。
使用建议的(第3阶段) async
功能。 他们保证返回承诺,因此您不必担心在设置承诺链时捕获同步异常。
(async () => {throw new Error})().catch(::console.error)
您可以承诺foo
以便在foo
触发器内自动发生任何错误都会触发拒绝函数。 如;
function foo(){ throw new Error("booom"); return Promise.resolve(42); } function bar(v) { console.log("I am resolved with " + v())} function baz(v) { console.log("I am rejeceted because of a " + v)} function go() { Promise.resolve(foo) .then(bar) .catch(baz); } go();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.