Можно ли удалить объект без ссылки на поток? - PullRequest
0 голосов
/ 10 июня 2018

У меня есть ReadableStream и WriteableStream.После создания экземпляров обоих объектов я передал поток для чтения в поток для записи.

  const readable = getReadableStreamSomehow();
  const writeable = new WriteableStreamObject();
  readable.pipe(writeable);

Есть ли способ отменить передачу потока без ссылки на читаемый поток.

Обычный способ сделать это, конечно, -

  readable.unpipe(writeable);

Однако в этом случае у меня больше нет доступа к читаемому объекту, только к объекту с возможностью записи.Я хотел бы сделать что-то вроде

  writeable.disconnectAllStreams()

Причина, по которой мне нужно это сделать, заключается в том, что в какой-то момент мне больше не нужна запись и мне нужно отключить ее от потока.Я могу выбросить все ссылки для того, чтобы он был собран сборщиком мусора, но без отключения потока поток с радостью продолжит занимать память навсегда (поток никогда не заканчивается), а поскольку поток все еще сохраняет ссылку, объект никогда не получит сборщик мусора.

1 Ответ

0 голосов
/ 10 июня 2018

Доступный для записи, на самом деле, не знает, что что-то передано ему по трубопроводу.Он просто знает, что что-то регулярно пишет в него.Это читаемый файл, который отслеживает один или несколько других потоков, на которые он направляется.Таким образом, нет встроенного способа сделать это:

writeable.disconnectAllStreams()

, потому что записываемый объект на самом деле не знает, кто к нему направлен.

Вы можете поместить читаемый поток в качестве ссылкина запись:

const readable = getReadableStreamSomehow();
const writeable = new WriteableStreamObject();

// store readable on the writable so we can unpipe it later
writable.pipeStream = readable;

// set the pipe
readable.pipe(writeable);

Затем, позже вы можете сделать:

// get the readable and unpipe it
writable.pipeStream.unpipe(writable);
...