Autumn_Ning_Blog
Autumn_Ning_Blog copied to clipboard
Promise内存泄漏的危险
trafficstars
(function() {
function printMemory(i) {
console.log(i) ;
console.log(process.memoryUsage())
}
// 记录 Promise 链的长度
var i = 0;
function run() {
return new Promise(function(resolve) {
// 每增加 10000 个 Promise 打印一次内存使用情况
if (i % 1000 === 0) {
global.gc()
printMemory(i);
}
i++;
// 模拟一个异步操作
setTimeout(function() {
// 1000 个 Promise 之后退出
if(i === 10000 * 10) return resolve();
// 如果 resolve 的参数是一个 Promise ,外层 Promise 将接管这个 Promise 的状态,构成嵌套 Promise
resolve(run());
}, 0);
}).then(function() {
// console.log(j);
return true;
});
}
run().then(function (r) {
global.gc()
console.log(111)
printMemory();
});
})();
可以参考Promise/A+规范 以及该issue
应该避免长时间的在根promise下不进行resolve操作,而进行递归promise,根据spec我们知道当resolve一个promise的时候,只有当下层的promise返回了状态,生层的promise才能返回状态