Подтвердить что ты не робот

Как разрушить горный поток

У меня есть следующий пример

const input = _();
const output = _()
  .each(x => console.log('out', x));

input
  .pipe(output);

input.write(1)
output.destroy();
input.write(2); 

Насколько я могу прочитать в документации (http://highlandjs.org/#destroy), уничтожение потока должно очистить сломанную трубу. Вместо этого я получаю следующую ошибку:

out 1
out 2
node_modules/highland/lib/index.js:1114
        throw new Error('Can not call next after nil');
        ^

Error: Can not call next after nil

Есть ли у кого-нибудь представление о том, почему это происходит, и каков правильный способ уничтожения потока?

4b9b3361

Ответ 1

Из чтения документации это выглядит как Это - ваш ответ на вашу ошибку. Способ, которым поток позволяет остальной части программы знать, что она закончилась, заключается в передаче "nil" в качестве следующей части данных в потоке. Рассматривая пример кода по этой ссылке, вы должны определить, что поток закончился и действует соответственно.

Вот почему вы получаете сообщение об ошибке - ваша труба пытается перейти к следующим данным, но бросает ошибку, поскольку нет такой вещи, как следующая после "nil".

Что касается правильного способа уничтожения потока, я думаю, что способ, которым вы пользуетесь, является правильным способом (я не так знаком с highland.js, так что просто основываясь на чтении документации и знакомстве с javascript в вообще), это просто, что эффекты не обязательно то, что вы ожидаете. Я не ожидал бы уничтожения выхода, чтобы разрушить трубу, это потому, что труба "принадлежит" к вводу, так как это то, против чего она была вызвана. Если вы хотите уничтожить свою трубу, я бы предположил, что путь к ней будет состоять в том, чтобы вызвать

input.destroy()

вместо этого (или действительно, а также output.destroy(), так как вы не хотите оставлять свободные концы!). В документации указано, что вы должны вызывать destroy() или .end() для любого сконструированного вручную потока (например, вы уже выше).

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