什么是更快:尝试捕捉与承诺

Ale*_*rff 4 javascript try-catch node.js promise es6-promise

我听到这样的意见,你应该避免使用try/catch,因为它需要很多资源.那么可以承诺错误处理可能会更快吗?或者根本没关系?

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';});
Run Code Online (Sandbox Code Playgroud)

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

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

Ber*_*rgi 13

您应该将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;
}
Run Code Online (Sandbox Code Playgroud)

当且仅当你已经有承诺的代码,那么就可以避免在某些情况下:当你想例外拒绝承诺.在这些情况下,你应该让你的promises的内置错误处理完成它的工作,而不是通过一个额外但无意义的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());
});
Run Code Online (Sandbox Code Playgroud)

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

/* Right */
….then(function(res) {
    …
    return somethingExceptionally();
}).…
Run Code Online (Sandbox Code Playgroud)

  • 我添加了一个 Promise 滥用的例子,其中应该使用 `try/catch`。我希望它能很好地为您的回答服务。 (2认同)