【问题标题】:Does using Promise and not rejecting it cause memory leak? [duplicate]使用 Promise 而不拒绝它会导致内存泄漏吗? [复制]
【发布时间】:2018-01-26 02:40:21
【问题描述】:

代码如下:

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

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

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

【问题讨论】:

  • 如果这个是关于 ES/JS 原生 Promises 而另一个是 jQuery Promises,这怎么会是重复的?

标签: javascript memory-leaks es6-promise


【解决方案1】:

抛出错误将自动拒绝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))

但是,如果我在我的承诺中使用了 Web API,例如 setTimeout(),该怎么办。看下面的代码:

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 块。如果有任何错误,您需要从setTimeout()reject() 来启动catch 块。

会不会造成内存泄露?

答案: no

test().then().catch() 将在执行完毕后立即被垃圾回收。但是,如果您将承诺保留在像 var p = test(); p.then().catch() 这样的全局变量中,那么变量 p 将保留在内存中,不会被垃圾回收。但这不是内存泄漏。内存泄漏是一个完全不同的方面,不适用于这种场景。

【讨论】:

  • 它会,但它也与内存泄漏无关。 Promise 只是一个 Javascript 对象,当没有人保留对它的引用时,无论它是已解决、被拒绝还是仍在等待中,都会被垃圾回收。
  • @jfriend00 - 如果有很多待处理和被拒绝的进程需要进行垃圾回收,它会导致内存泄漏吗?因此,如果这些进程正在增加,则会造成泄漏,因为它会消耗内存。对吗?
  • @happygolucky - 不。将被垃圾收集的对象不是泄漏。泄漏是永远不会被垃圾收集的东西。从定义上讲,泄漏是累积的东西,并且没有被系统清理掉。如果您处于一个紧密的循环中,需要对数百万个需要进行垃圾回收的对象进行垃圾收集,这可能会造成临时内存问题,但这不是泄漏或由该问题所引起的问题。
【解决方案2】:

这不会导致内存泄漏。但是,在使用其中一种时,需要考虑一些差异。

  • throw 不同,reject() 不会终止控制流。因此,如果您有想要在被拒绝后继续执行的代码,您可能会更喜欢reject()

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

【讨论】:

  • 你能详细说明一下Using throw in nested promises can cause unexpected results吗?感谢您提供有关此主题的一些参考资料。
猜你喜欢
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2010-11-18
  • 2021-03-23
  • 2021-09-25
  • 2014-12-08
相关资源
最近更新 更多