wangning0 / Autumn_Ning_Blog

572 stars 119 forks source link

Promise内存泄漏的危险 #44

Open wangning0 opened 6 years ago

wangning0 commented 6 years ago
(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才能返回状态