一尘不染

更快的方法:尝试赶上Promise与Promise

node.js

我听到这样的观点,您应该完全避免使用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';});

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

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


阅读 213

收藏
2020-07-07

共1个答案

一尘不染

只能 将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;
}

当且仅当
你已经有承诺的代码,那么就可以避免在某些情况下:当你想例外拒绝承诺。在这些情况下,您应该只允许对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());
});



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

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