如何解决解决Socket.io回调中的Promise将返回对未获取垃圾的变量的引用
这是有问题的代码。除了两个特定的功能外,它正常运行:
(1)如果我包括delete b.x
和delete b.y
,则当这些字段位于undefined
时,使用该函数结果的函数将出错。我假设这是因为它正在传递对该对象的引用。通常,我只需要复制b
并解决该问题,但这会引出下一个问题:
(2)似乎发生了严重的内存泄漏,其中我在chrome上运行内存事件探查器,并且看到该功能的许多用途保留了多个GB。当我查看保留的特定对象时,即使已解决了诺言,b
也显然已保留。这与delete b.x
即使在解决后仍会导致错误的事实相符。
const streamTrainBatch = (
trainConfig,socket: typeof Socket
): Promise<{ x: any[]; y: any[] }> =>
new Promise((resolve) => {
// stream batch_size arrays and concatenate them along batch axis (0)
const batch_ids: any = trainConfig.fileIds.train.slice(
0,trainConfig.batchSize
);
const new_batch: any = { x: [],y: [] };
let xs = [];
let ys = [];
let totalBatchesGotten = 0;
for (const idToGet of batch_ids) {
if (socket) {
socket.emit("stream data",{
dataset: trainConfig.datasetName,split: "train",fileID: idToGet,});
}
}
if (socket) {
socket.on("data",(data: Buffer) => {
let [x,y] = processRawData(data);
if (x && y) {
//new_batch["x"].push(x[0][0]); // remove the batch axis (unitary) and... other axis lol
//new_batch["y"].push(y[0][0]);
xs.push(x[0][0]);
ys.push(y[0][0]);
totalBatchesGotten += 1;
if (totalBatchesGotten >= batch_ids.length) {
const b = { x: [...xs],y: [...ys],debug: "true" };
//new_batch.x = [];
//new_batch.y = [];
xs = [];
ys = [];
resolve(b);
delete b.x;
delete b.y;
}
}
return;
});
}
});
如何确保b
被垃圾回收?
我真的可以在这里使用一些帮助,因为我已经花了两天的时间来解决这个问题,而且似乎一无所获。 谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。