什么更快:try catch vs Promise

新手上路,请多包涵

我听到这样的意见,你应该完全避免使用 try/catch,因为它需要很多资源。那么 promise 错误处理可以更快吗?或者根本不重要?

 function f(somethingDangerous) {
  return new Promise((resolve, reject) => {
    // try {
    //   somethingDangerous();
    //   resolve();
    // } catch (err) {
    //   reject(err);
    // }

    // VS

    somethingDangerous();
    resolve();
  }).catch((err) => {
    console.error('Catched: ' + err);
  });
}

f(() => {throw 'DANGEROUS THING';});

UPD :我知道 try/catch 不能与内部的异步代码一起使用。我只是想知道是否有任何理由因为性能问题而避免使用 try/catch?上述两种方法之间有什么区别吗?

UPD2 :试图让我的马赛跑 :) https://jsperf.com/try-catch-vs-promise

原文由 Maksim Nesterenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 707
2 个回答

您应该 将 Promises 用于异步函数,而不是其他任何东西。不要将它们滥用为错误 monad,那将是一种资源浪费,而且它们固有的异步性会使一切变得更加繁琐。

当你有同步代码时,使用 try / catch 进行异常处理。

 /* Wrong */
return new Promise(function(resolve, reject) {
    resolve(x / y);
}).catch(err => NaN)

/* Right */
try {
    return x / y;
} catch(e) {
    return NaN;
}

如果 您已经有承诺代码,则可以在某些情况下避免这种情况:当您希望异常拒绝承诺时。在这些情况下,你应该让你的承诺的内置错误处理完成它的工作,而不是通过额外但毫无意义的 try / catch 层使一切复杂化:

 /* Wrong */
new Promise(function(resolve, reject) {
    try { // when used synchronous in the executor callback
        …
        resolve(somethingSynchronous());
    } catch (e) {
        reject(e);
    }
});

/* Right */
new Promise(function(resolve, reject) {
    …
    resolve(somethingExceptionally());
});

 /* Wrong */
….then(function(res) {
    try {
        …
        return somethingExceptionally();
    } catch(e) {
        return Promise.reject(e);
    }
}).…

/* Right */
….then(function(res) {
    …
    return somethingExceptionally();
}).…

原文由 Bergi 发布,翻译遵循 CC BY-SA 4.0 许可协议

try/catch 当你有完整的 synchronous 代码时,成语工作得很好,但是 asynchronous 操作不会导致它无用,没有错误。也就是说,当外部堆栈运行并到达最后一行时,函数将开始运行,没有任何错误。如果在未来的某个时刻在异步函数中发生错误——什么都不会被捕获。

当我们使用 Promise 时,您可能会说,“我们失去了错误处理”。没错,我们不需要在这里做任何特殊的事情来传播错误,因为我们返回了一个承诺,并且内置了对错误流的支持。

原文由 Lakshmi Swetha G 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题