Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript是否承诺在未被拒绝或解决时会造成内存泄漏?_Javascript_Memory Leaks_Es6 Promise - Fatal编程技术网

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)
。请随意添加更好的答案。正在尝试修复答案。请随意添加一个包含更多信息的竞争答案,我将向上投票。可能是重复的