首页 > 代码库 > 如果一个promise永不resolve,会内存泄漏吗
如果一个promise永不resolve,会内存泄漏吗
答:跟内存泄漏没有直接关系
gc的策略不会改变,如果该promise没有被人引用,就会被gc掉。如果仍被引用,就不会被gc掉。
即使一个promise,resolve或者reject了,但是它还被人引用,仍然占用内存。
李政 2015/11/19 16:28:39
嗯差不多,可以认为promise就是一个普通的对象,不过在vm底层会由host提供一些机制来托管promise。比如chrome的调试器里可以看到所有的promise
李政 2015/11/19 16:28:56
比如node里面通过nextTick实现new Promise的回调函数调用
梁志 2015/11/19 16:29:59
new Promise的回调函数调用,是指promise的执行体吗
梁志 2015/11/19 16:30:11
我一直认为执行体是个同步过程
16:30:46
梁志 2015/11/19 16:30:46
我之前写过很多测试,并发,没有找到异步的证据
李政 2015/11/19 16:31:36
node是异步的,chrome浏览器是同步的
梁志 2015/11/19 16:32:08
怎么知道呢
16:33:03
李政 2015/11/19 16:33:03
哦不对,的确是同步的,then是异步的
16:35:09
李政 2015/11/19 16:35:09
then的异步调用需要host机制支持
16:40:25
野人王 2015/11/19 16:40:25
按照李政的说法做了个实验,发现node里原生Promise和then是同步的,bluebird的then是异步的
李政 2015/11/19 16:40:46
then是异步的呀
李政 2015/11/19 16:41:03
你试试这个:
var a = 0; Promise.resolve(0).then(function(){console.log(a)}); a = 1;
16:42:26
梁志 2015/11/19 16:42:26
node原生Promise其实是V8的promise实现吧
野人王 2015/11/19 16:44:04
new Promise(function(resolve, reject){
console.log(1);
for(var i=0; i<999999999; i++){}
resolve();
}).then(function(){
console.log(2)
})
setInterval(function(){
console.log(‘n‘)
})
16:44:53
李政 2015/11/19 16:44:53
then用nextTick实现,比setInterval快
野人王 2015/11/19 16:46:50
果然!
16:46:57
野人王 2015/11/19 16:46:57
确实是异步的
徐子龙 2015/11/19 16:47:43
徐子龙 2015/11/19 16:47:49
这个7是怎么解释的。。
野人王 2015/11/19 16:48:45
啥东西的返回值吗
李政 2015/11/19 16:48:47
setInterval的返回值
16:49:05
野人王 2015/11/19 16:49:05
不过你那段代码不能证明他是异步的,then执行时就是放进callback队列
梁志 2015/11/19 16:49:34
new Promise(function(resolve, reject){
console.log(1);
for(var i=0; i<999999999; i++){}
resolve();
}).then(function(){
console.log(2)
});
process.nextTick(function() {
console.log(‘n‘)
});
徐子龙 2015/11/19 16:49:37
o对
野人王 2015/11/19 16:49:45
调用callback是异步的
梁志 2015/11/19 16:49:53
可是浏览器有nextTick吗
李政 2015/11/19 16:50:28
虽然print出来的7在2后面
梁志 2015/11/19 16:50:36
李政 2015/11/19 16:50:46
那就改改
徐子龙 2015/11/19 16:56:12
找个数组
徐子龙 2015/11/19 16:56:16
往里面push
梁志 2015/11/19 16:56:18
一直以为是等价的
徐子龙 2015/11/19 16:56:32
去掉console的影响
居玉皓 Roscoe 2015/11/19 16:57:41
貌似setTimeout用的红黑树,nextTick用的链表
16:58:18
野人王 2015/11/19 16:58:18
不是吧。。。nextTick是eventLoop中加的,setInterval是Timer
李政 2015/11/19 16:58:43
setTimeout用的timer机制,和其它事件源一起竞争的,nextTick就是作弊直接插队
梁志 2015/11/19 16:59:09
timer有自己的队列,这个nextTick看来有自己的队列
野人王 2015/11/19 16:59:43
李政,你说的host机制,有啥科普资料吗。。
17:06:23
梁志 2015/11/19 17:06:23
我想起来了。其实promise的then是异步的原因是,害怕then.then.then太长,导致阻塞进程,违背了js的事件机制的特征。可是这样就给有竞争条件的代码带来新的问题。
梁志 2015/11/19 17:07:06
并不是非要这么实现,只是一种更高层面的考虑,跟底层技术可能无关
http://v8.paulfryzel.com/docs/master/classv8_1_1_isolate.html#ac3cbe2a1632eb863912640dcfc98b6c8
如果一个promise永不resolve,会内存泄漏吗