JavaScript promise 在未被拒绝或未解决时是否会造成内存泄漏?
Does JavaScript promise create memory leaks when not rejected or resolved?
我处于这样一种情况,我需要在 "parallel" 中执行异步函数,并以最佳结果继续执行程序。因此我写了这样的东西:
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);
});
现在,我想知道在使用 promise 时这是否是一种好的做法?不是更频繁地解决或拒绝它们,然后任何东西都会造成内存泄漏吗?它们最终每次都被 GC 了吗?
这导致内存泄漏的唯一原因是因为 p
是一个全局变量。最后设置p = null;
,或者避免使用全局变量:
var console = { log: function(msg) { div.innerHTML += msg + "<br>"; }};
Promise.race(new Array(10).fill(0).map(function(entry, index) {
return (function(index) {
return new Promise(function(resolve) {
setTimeout(function() {
var success = Math.random() > 0.7;
console.log((success? "R":"Not r") + "esolving "+ index +".");
success && resolve(index);
}, Math.random() * 5000 + 200);
});
})(index);
})).then(function (res) {
console.log("FOUND: " + res);
}).catch(function (err) {
console.log("ERROR: " + err);
});
<div id="div"></div>
Promises 是垃圾,当没有任何内容保留它们时,即当您的 JS 和浏览器(此处 setTimeout
)不再引用它们时,它们就会被循环收集。
一旦 p
中的一个条目成功或失败,以较早者为准,setTimeout
将在 5.2 秒后放弃所有内容。 JavaScript 然后将愉快地垃圾收集承诺,无论它们是否已被解决、拒绝或两者都没有。没有伤害。
您唯一要避免的是垃圾收集拒绝承诺,因为这可能会触发浏览器警告,因为它表明存在网络编程错误。
当然,它们中有 30% none 会解决,在这种情况下,这会泄漏(直到您关闭选项卡)。
这个设计好吗?
我认为这取决于功能在做什么。如果它们很轻,那么我看不出有什么问题。如果他们正在进行繁重的计算或有副作用,那么他们希望有一些 API 来取消操作,以帮助节省资源。
我处于这样一种情况,我需要在 "parallel" 中执行异步函数,并以最佳结果继续执行程序。因此我写了这样的东西:
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);
});
现在,我想知道在使用 promise 时这是否是一种好的做法?不是更频繁地解决或拒绝它们,然后任何东西都会造成内存泄漏吗?它们最终每次都被 GC 了吗?
这导致内存泄漏的唯一原因是因为 p
是一个全局变量。最后设置p = null;
,或者避免使用全局变量:
var console = { log: function(msg) { div.innerHTML += msg + "<br>"; }};
Promise.race(new Array(10).fill(0).map(function(entry, index) {
return (function(index) {
return new Promise(function(resolve) {
setTimeout(function() {
var success = Math.random() > 0.7;
console.log((success? "R":"Not r") + "esolving "+ index +".");
success && resolve(index);
}, Math.random() * 5000 + 200);
});
})(index);
})).then(function (res) {
console.log("FOUND: " + res);
}).catch(function (err) {
console.log("ERROR: " + err);
});
<div id="div"></div>
Promises 是垃圾,当没有任何内容保留它们时,即当您的 JS 和浏览器(此处 setTimeout
)不再引用它们时,它们就会被循环收集。
一旦 p
中的一个条目成功或失败,以较早者为准,setTimeout
将在 5.2 秒后放弃所有内容。 JavaScript 然后将愉快地垃圾收集承诺,无论它们是否已被解决、拒绝或两者都没有。没有伤害。
您唯一要避免的是垃圾收集拒绝承诺,因为这可能会触发浏览器警告,因为它表明存在网络编程错误。
当然,它们中有 30% none 会解决,在这种情况下,这会泄漏(直到您关闭选项卡)。
这个设计好吗?
我认为这取决于功能在做什么。如果它们很轻,那么我看不出有什么问题。如果他们正在进行繁重的计算或有副作用,那么他们希望有一些 API 来取消操作,以帮助节省资源。