最佳实践:承诺 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 是安全的,它们允许您在异步代码中使用 returnthrow 等同步工具。

同步:

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);
});