JavaScript是否承诺在未被拒绝或解决时会造成内存泄漏?
我需要以“并行”方式执行异步函数,并以最佳结果继续执行程序。因此我写了这样的话:JavaScript是否承诺在未被拒绝或解决时会造成内存泄漏?,javascript,memory-leaks,es6-promise,Javascript,Memory Leaks,Es6 Promise,我需要以“并行”方式执行异步函数,并以最佳结果继续执行程序。因此我写了这样的话: var p = []; for (var i = 0; i < 10; ++i) (function (index) { p.push(new Promise(function (resolve, reject) { setTimeout(function () { var success = Math.random() > 0.7; console.log("R
var p = [];
for (var i = 0; i < 10; ++i) (function (index) {
p.push(new Promise(function (resolve, reject) {
setTimeout(function () {
var success = Math.random() > 0.7;
console.log("Resolving", index, "as", success ? "success" : "failure");
success && resolve(index);
}, Math.random() * 5000 + 200);
}));
})(i);
Promise.race(p).then(function (res) {
console.log("FOUND", res);
}).catch(function (err) {
console.log("ERROR", err);
});
var p=[];
对于(变量i=0;i<10;++i)(函数(索引){
p、 推送(新承诺(功能)(解决、拒绝){
setTimeout(函数(){
var success=Math.random()>0.7;
console.log(“解析”,索引,“as”,success?”success:“失败”);
成功与解决(索引);
},Math.random()*5000+200);
}));
})(i) );
承诺。种族(p)。然后(功能(res){
console.log(“FOUND”,res);
}).catch(函数(err){
日志(“错误”,err);
});
现在,我想知道这是否是一个很好的实践,当工作的承诺?解决或拒绝它们的频率不是比任何事情都会导致内存泄漏吗?它们是否每次都会被GC'ed?导致内存泄漏的唯一原因是
p
是一个全局变量。设置p=null代码>结尾,或避免使用全局变量:
var控制台={log:function(msg){div.innerHTML+=msg+“
”;};
新数组(10)、填充(0)、映射(函数(条目、索引){
返回(函数(索引){
返回新承诺(函数(解析){
setTimeout(函数(){
var success=Math.random()>0.7;
log((成功?“R”:“非R”)+“esolving”+索引+”);
成功与解决(索引);
},Math.random()*5000+200);
});
})(索引);
})).然后(功能(res){
console.log(“找到:+res”);
}).catch(函数(err){
日志(“错误:+err”);
});代码>
Promise.race不会对剩余的承诺进行垃圾收集,并重复运行Promise.race,但该承诺无法解决已知的内存泄漏问题。请看@brainkim,这是一个实现,听起来像是V8中的一个。如果你检查Chromium上的相关bug,你会发现没有这样的协议@你说得对。我已经有一段时间没看到这个了。我回答时可能误读了success&&resolve(index)
。请随意添加更好的答案。正在尝试修复答案。请随意添加一个包含更多信息的竞争答案,我将向上投票。可能是重复的