最佳实践:承诺拒绝/抛弃

时间:2016-01-07 23:07:15

标签: promise ecmascript-6 angular-promise bluebird es6-promise

背景

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是否仍然可以使用?

1 个答案:

答案 0 :(得分:3)

  

显然,如果涉及异步代码(例如数据库或HTTP请求),则无法使用throw,因为堆栈已更改。

这是承诺的一半。 承诺是安全的,它们允许您在异步代码中使用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);
});