【问题标题】:Best practice: Promises reject/throw最佳实践:Promise 拒绝/抛出
【发布时间】:2016-04-12 12:47:41
【问题描述】:

背景

This question 建议在 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,因为堆栈已更改。

作为“最佳实践”,我应该始终在承诺中使用reject 以保持一致吗?还是应该在某些情况下仍使用throw

【问题讨论】:

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


    【解决方案1】:

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

    这是承诺的一半。 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);
    });
    

    【讨论】:

    • 那么,你是说我可以在promise 中放入一个setTimeout?
    • @aaaidan 不,你可以 convert it to a promise returning function 然后把它扔进去 - 承诺代码有效地包装在 try/catch 中,将 throws 转换为拒绝。
    • 对,所以我想我的问题更广泛地涉及您是否应该理所当然地使用resolve/reject(而不是return/throw),或者有时使用return/throw是否是一种好习惯,澄清意图,说。这有意义吗?
    • @aaaidan 更喜欢 throwreturn 如果可能的话,当你 return 被拒绝的承诺时,它实际上就像在做 function fn(err){ throw err}; return fn(Error); 这不如 throw err 好:D
    • 这是“最佳实践”变得困难的地方,因为我提出了相反的建议:) 返回拒绝不会导致 JS 突然完成,所以我希望它更快,然后您就不会混合错误处理范例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多