当前位置: 首页 > 面试题库 >

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

孟建木
2023-03-14
问题内容

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


问题答案:

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

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


 类似资料:
  • 问题内容: 我正在为已经存在很长时间的应用程序编写单元测试。我需要测试的一些方法是这样构建的: 如果要测试这些方法,则必须在单元测试中编写如下代码: 这样做是一种好习惯吗?还是有其他方法可以测试这些方法? 我在Internet上进行了一些研究,发现了一些带有和的注释解决方案,但这是行不通的(Eclipse不断在测试中显示错误行)。我不知道这些是否是好的解决方案,因为对于整个单元测试而言,我还是一个

  • 问题内容: 我正在尝试熟悉Swift 2和iOS 9 的新声明 我的问题是,当NSURLSession发生错误时,data参数返回nil,而错误返回某些信息。在iOS 8中,这是预期的功能,我们只使用了if语句来查找Data是否为nil。 但是 ,有了,我想到了一个new 关键字,它旨在查看是否可以正常工作,如果不能正常工作,则默认为所编写的任何代码 但是,由于数据为零,所以我遇到了意外崩溃。这是

  • 我正在尝试从Ansible 2.9升级。2至2.10。我知道当前的ansible需要删除,我相信我在这方面取得了成功。文档中有几个不同的命令行(使用pip安装Ansible)。那个似乎没有出错的人使用了python3,并产生了。。。 但“which ansible”不产生输出,“ansible--version”命令未找到。 使用原始的python(2.7.16)产生... 但仍然没有答案。你知道

  • 问题内容: 我必须接一个热键(意思是,按,仅释放,然后再按一次)。这是我想做的事情: 我的想法是,一旦按下,就必须再次注册相同的热键并捕获它。我要安排一个计时器,因为第二次按下应该很快。但是我认为我走错了路,因为这会使事情变得非常复杂。 你的想法?PS那里没有窗口,它捕获了 全局 热键。我还尝试了Internet上的很多东西,但是它并没有按我想要的那样工作,因此在向我提供任何代码之前,请对其进行测

  • 问题内容: 我在某个字段上有一个带有getter 和setter 的类,例如field 说一个类的对象。 在这里synchronized– 不是。 我正在从多个线程中更新值。每个线程都在获取值,并进行适当设置。线程不会以任何方式共享任何其他资源。 在每个线程中执行的代码如下。 该方法只是对通过传递给它的参数从构造函数内部更新的成员调用上述方法: 当我按较大的顺序运行此线程时,线程之间的交错并不多-

  • 问题内容: 为了提高其性能,我一直在使用VisualVM采样器对我的一个应用程序进行性能分析,最小采样周期为20ms。根据探查器,主线程在该方法中花费了将近四分之一的CPU时间。 我正在与该模式一起使用,以将数字“转换” 为正好有六个十进制数字的字符串表示形式。我知道这种方法相对昂贵并且 被 多次调用,但是我对这些结果感到有些惊讶。 这种采样分析器的结果在多大程度上准确?我将如何验证它们-最好不借