使用Promise而不是拒绝它会导致内存泄漏吗?

时间:2018-01-26 02:40:22

标签: javascript memory-leaks es6-promise

代码如下:

function test(value){
  return new Promise(function (fulfill, reject){
     try {
       fulfill(true);
     } catch(e) {
       throw e;
     }
  });
}

我担心的是,当您使用Promisethrow error代替reject(e)时,会导致内存泄漏吗?

因为对我而言,抛出错误而不是拒绝它不会拒绝或退出承诺之外的错误。错误只会在Promise内部出现。让我知道你的意见。

2 个答案:

答案 0 :(得分:3)

抛出错误会自动拒绝Promise。详细了解here

但有一些事情需要讨论。请查看以下代码。代码抛出一个错误。错误从promise的内部抛出。它会自动拒绝并启动捕获链。

function test(value){
  return new Promise(function (fulfill, reject){

       throw e;

  });
}

test('sample text').then(result=>console.log(result)).catch(result=>console.log(result))

但是,如果我在我的承诺中使用了诸如setTimeout()之类的Web API,那该怎么办呢?请查看以下代码:

function test(value){
  return new Promise(function (fulfill, reject){
       setTimeout(function(){
          throw new Error('haha');
       },1000)


  });
}

test('sample text').then(result=>console.log(result)).catch(result=>console.log(result))

Web API是异步的。每当从promise内部调用Web API时,JavaScript引擎都会将async代码移到外部执行。简单来说,Web API或异步代码在主调用堆栈之外执行。

因此,从setTimeout()抛出错误不会有任何来电承诺的引用,因此无法启动catch阻止。如果有任何错误,您需要reject() setTimeout() catch来启动no阻止。

是否会导致内存泄漏?

答案: test().then().catch()

var p = test(); p.then().catch() 会在完成执行后立即进行垃圾回收。但如果你能在 p 这样的全局变量中保留这个承诺,那么变量 // Delete this line httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 将保留在内存中,它会赢得& #39;垃圾收集。但这不是内存泄漏。内存泄漏是一个完全不同的方面,并不适用于这种情况。

答案 1 :(得分:1)

这不会导致内存泄漏。但是,使用其中一个时,值得考虑的差异。

  • throw不同,reject()不会终止控制流程。因此,如果您希望在拒绝后继续执行代码,则可能更喜欢reject()

  • 在嵌套承诺中使用throw会导致意外结果。在这种情况下,建议使用reject()