javascript - 什么是更快的 : try catch vs Promise

原文 标签 javascript node.js promise try-catch es6-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';});

更新 : 我知道 try/catch 不适用于内部的异步代码。我只是想知道是否有任何理由因为性能问题而避免使用 try/catch?以上两种方法有什么区别吗?

UPD2 : 想和我的马赛跑 :) https://jsperf.com/try-catch-vs-promise

最佳答案

你应该使用 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;
}
如果 你已经有了 promise 代码,你可以在某些情况下避免这种情况:当你希望异常拒绝 promise 时。在这些情况下,你应该让你的 Promise 的内置错误处理来完成它的工作,而不是通过额外但毫无意义的 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();
}).…

关于javascript - 什么是更快的 : try catch vs Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42648956/

相关文章:

php - IE的条件标签-如果浏览器是IE,是否可能不加载JS文件?

node.js Hello World 失败

node.js - MongoDB/Mongoose - 用逗号导入数字

jQuery 包装延迟和 promise

node.js - 如何在简单的 Mocha 单元测试中处理 UnhandledPromiseRejectionWarning

javascript - 如何使用 vo.js 在 for 循环中产生多个 promise ?

javascript - 如何阻止我的函数返回 "Reference error: (...) is not defined"

javascript - 如何同时用html元素替换粗体,带下划线等文字?

javascript - jQuery.extend 抛出带有自引用的堆栈溢出异常

node.js - AngularJS 中 $save 方法的回调