2015-09-21 11 views
12

Mam następujący przykładjak zniszczyć potoku górskim

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

input 
    .pipe(output); 

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

O ile mogę przeczytać w dokumentacji (http://highlandjs.org/#destroy) niszczenie strumień powinien oczyścić złamaną fajkę. Zamiast pojawia się następujący błąd:

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 

Czy ktoś ma jakiś wgląd dlaczego ten happends, a co jest poprawny sposób, aby zniszczyć jest strumień?

Odpowiedz

4

Po przeczytaniu dokumentacji wygląda na to, że odpowiedź na błąd jest This. Sposób, w jaki strumień informuje resztę programu, że się zakończył, to przekazanie "nil" jako kolejnego fragmentu danych w strumieniu. Patrząc na przykładowy kod pod tym linkiem, od Ciebie zależy, czy transmisja została zakończona i czy działasz zgodnie z nią.

Dlatego pojawia się błąd - Twoja rura próbuje przejść do następnych danych, ale generuje błąd, ponieważ po "zero" nie ma czegoś takiego jak następny.

Jeśli chodzi o prawidłowy sposób na zniszczenie strumienia, myślę, że sposób, w jaki używasz jest poprawny (nie jestem zaznajomiony z highland.js, więc jest to oparte na czytaniu dokumentacji i znajomości javascriptu ogólnie), po prostu efekty nie muszą być zgodne z oczekiwaniami. Nie spodziewałbym się, że zniszczysz wyjściowy, aby zniszczyć rurę, ponieważ rura "należy" do wejściowego, ponieważ to, do czego została wywołana. Jeśli chcesz zniszczyć rury, to sobie wyobrazić, że droga do tego zabrać byłoby nazwać

input.destroy() 

zamiast (lub faktycznie, jak również output.destroy(), jak nie chcą zostawić luźne końce!). Dokumentacja stwierdza, że ​​powinieneś wywołać metodę destroy() lub .end() w każdym ręcznie skonstruowanym strumieniu (jak masz powyżej).

Pomyśl o tym w ten sposób. Jeśli mam źródło, które jest podłączone do miejsca docelowego, a ja usunę to miejsce docelowe, oczywiście dostanę błąd, ponieważ moje dane wejściowe nie mają dokąd pójść, a mój strumień wyjściowy powie wszystko inne, że dobiegło końca. Jeśli chcesz zniszczyć rurę, lepiej jest zniszczyć źródło, a jeśli zatrzymasz wyjście/cel, musisz znaleźć gdzie indziej, aby wejście było gotowe!

+0

Hmmm ... okej, to tłumaczy. Dzięki za to do tej pory :-). Pytanie brzmi: jak mogę zniszczyć wyjście i zachować strumień wejściowy, ponieważ wciąż go potrzebuję? OTOH w dokumentacji wyraźnie stwierdza, że ​​'destroy()' również usunie strumień z dowolnego źródła, więc brzmi to tak, jakbyś mógł również wypakować w ten sposób ze strumienia źródłowego. –

+0

To byłby dobry moment, aby zadać sobie pytanie, co próbujesz osiągnąć! Czy rura może zostać przekierowana do nowego wyjścia? Szczerze mówiąc nie mogę powiedzieć kategorycznie, ale pytanie brzmi: czy musisz? Gdy wywołasz funkcję .destroy() na wyjściu, to już nie istnieje, więc musisz zrobić coś na temat swojej rury na wejściu. Możesz spróbować zdefiniować nowe wyjście i ponownie wywołać .pipe na wejściu do tego nowego wyjścia, zobaczyć, co się tam dzieje. Lub możesz w pierwszej kolejności ponownie rozważyć zniszczenie danych wyjściowych. Czy możesz na nowo zdefiniować, co robi. A może nawet wykorzystując dane wejściowe? powinien zakończyć je wszystkie i zacząć od nowego zestawu? –

Powiązane problemy