最佳实践:承诺 reject/throw
Best practice: Promises reject/throw
背景
建议在 promise 函数中使用 throw
实际上等同于调用 reject
回调。
例如这些是等价的:
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
,因为堆栈已更改。
作为 "best practice",我是否应该 总是 在承诺中使用 reject
以保持一致?还是在某些情况下仍应使用 throw
?
Obviously, if there's async code involved (such as an database or HTTP request), you can't use throw, since the stack has changed.
这是承诺的一半。 Promise 是安全的,它们允许您在异步代码中使用 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);
});
背景
throw
实际上等同于调用 reject
回调。
例如这些是等价的:
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
,因为堆栈已更改。
作为 "best practice",我是否应该 总是 在承诺中使用 reject
以保持一致?还是在某些情况下仍应使用 throw
?
Obviously, if there's async code involved (such as an database or HTTP request), you can't use throw, since the stack has changed.
这是承诺的一半。 Promise 是安全的,它们允许您在异步代码中使用 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);
});