系统相关
首页 > 系统相关> > Javascript-使用Promise而不拒绝它会导致内存泄漏吗?

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

作者:互联网

这个问题已经在这里有了答案:            >            Will not resolving a deferred create memory leaks?                                    1个
代码如下:

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

我担心的是,当您使用Promise并引发错误而不是reject(e)时,这会导致内存泄漏吗?

因为对我来说,抛出错误而不是拒绝错误不会拒绝或退出promise之外的错误.该错误将在Promise中消失.让我知道你的意见.

解决方法:

抛出错误将自动拒绝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引擎都会将该异步代码带到外部执行.简单来说,Web API或异步代码将在主调用堆栈之外执行.

因此,从setTimeout()引发错误将没有任何对调用方promise的引用,因此无法启动catch块.如果有任何错误,则需要从setTimeout()中拒绝它以启动catch块.

会导致内存泄漏吗?

答:不可以

一旦完成执行,test().then().catch()将被垃圾回收.但是如果您将诺言保存在像var p = test();这样的全局变量中, p.then().catch(),则变量p将保留在内存中,不会被垃圾回收.但这不是内存泄漏.内存泄漏是一个完全不同的方面,不适用于这种情况.

标签:es6-promise,memory-leaks,javascript
来源: https://codeday.me/bug/20191025/1928388.html