背景
This question表示在promise函数中使用throw
实际上与调用reject
回调相同。
e.g。这些是等价的:
new Promise(function(resolve, reject) {
throw new Error("sadface"); // Using throw
}).catch(function(e) {
// ... handle error
});
new Promise(function(resolve, reject) {
reject(new Error("sadface")); // Using reject
}).catch(function(e) {
// ... handle error
});
问题
显然,如果涉及异步代码(例如数据库或HTTP请求),则无法使用throw
,因为堆栈已更改。
作为"最佳实践",我应该始终在承诺中使用reject
来保持一致吗?或者在某些情况下throw
是否仍然可以使用?
答案 0 :(得分:3)
显然,如果涉及异步代码(例如数据库或HTTP请求),则无法使用throw,因为堆栈已更改。
这是承诺的一半。 承诺是安全的,它们允许您在异步代码中使用return
和throw
等同步工具。
同步:
try {
return fn();
} catch (e) {
// handle error
return recover(e);
}
承诺:
fn().catch(recover);
或者更详细地说:
Promise.resolve().then(function() {
return fn();
}).catch(function(e) {
return recover(e);
});