我有以下示例
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
有没有人对这种情况发生的原因有所了解,以及破坏流的正确方法是什么?
答案 0 :(得分:4)
通过阅读文档,看起来This是您的错误的答案。流允许程序的其余部分知道它已经结束的方式是将“nil”作为流上的下一条数据传递。查看该链接上的示例代码,由您决定流已结束并采取相应措施。
这就是你收到错误的原因 - 你的管道正在尝试继续下一个数据,但是因为在“nil”之后没有下一个这样的东西而抛出错误。
至于破坏流的正确方法,我认为你使用的方式是正确的方式(我不熟悉highland.js,所以这只是基于阅读文档和熟悉javascript in一般而言,只是效果不一定是你期望的。我不希望破坏输出来销毁管道,这是因为管道“属于”输入,因为它被称为反对它。如果你想破坏你的管道,我会想象它的方法就是调用
input.destroy()
而不是(或者实际上,以及output.destroy(),因为你不想留下松散的末端!)。文档声明你应该在任何手动构造的流上调用destroy()或.end()(就像你上面一样)。
以这种方式思考。如果我有一个管道到目的地的源,我删除了那个目的地,当然我会得到一个错误,因为我的输入无处可去,我的输出流将告诉其他所有它结束了。如果你想破坏管道,破坏源是更有意义的,如果你停止输出/目的地,你需要找到其他地方供你输入!