初学js,问题描述可能不是特别准确,还行见谅。
bing promise内存泄漏的时候,找到这样一篇文章 《关于Promise内存泄漏的问题》文章里有这样一段话: ***不过V8对Promise的实现存在内存泄漏问题,当一个promise无法resolve也无法reject的时候,就会发生内存泄漏。 ***
于是我就想验证一下promise在既没有resolve也没有reject的时候,时不时确实有内存泄漏。 接下来便有了这段代码 while(true){ var promise = new Promise(function(resolve){ }) promise .then(function(resolve){ console.log(resolve); }) } 运行起来之后,发现内存迅速增长。
接下来我加入resolve while(true){ var promise = new Promise(function(resolve){ resolve(1) }) promise .then(function(resolve){ console.log(resolve); }) } 再次运行,发现内存还是迅速增长。 这和文章里的描述不一样,于是我就怀疑是不是自己代码写的有问题。
便对代码做出一些修改,在while中emit事件,并在while之外创建并resolve Promise对象
var EventEmitter = require('events').EventEmitter;
var q = new EventEmitter();
q.on('loop', function(){
var promise = new Promise(function(resolve){
})
promise
.then(function(resolve){
console.log(resolve);
}
})
while(true){
q.emit('loop');
}
问题依旧存在,内存依然增长,打了断点,发现emit之后,进入回调函数处理,其实并不是异步的,所以这么改没有效果也说得过去。
接着我又我怀疑是作用域导致的问题,我便对代码做出一些修改。用(function(){})()来封闭作用域 while(true){ (function(){ var promise = new Promise(function(resolve){ resolve(‘test’); }) promise .then(function(resolve){ console.log(resolve); }) })() } 然而,这并没有什么卵用。
最后我想到了用setInterval来取代while setInterval(function(){ var promise = new Promise(function(resolve){ resolve(‘test’); }) promise .then(function(resolve){ console.log(resolve); }) },0);
再观察进程的内存,发现不再增长了。 即便我将resolve(‘test’);这行代码去掉,也见内存有所增长。
这里我想问问,一个promise,既不resolve,也不reject到底会不会有内存泄漏。 这里的内存泄漏问题,又到底是什么问题导致的?