【问题标题】:how to destroy a highland stream如何摧毁高地溪流
【发布时间】:2015-09-21 10:15:01
【问题描述】:

我有下面的例子

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

有没有人了解为什么会发生这种情况,以及销毁流的正确方法是什么?

【问题讨论】:

    标签: javascript highland.js


    【解决方案1】:

    通过阅读文档,This 似乎是您对错误的答案。流让程序的其余部分知道它已经结束的方式是传递“nil”作为流中的下一条数据。查看该链接中的示例代码,您可以确定流已结束并采取相应措施。

    这就是您收到错误的原因 - 您的管道正在尝试继续处理下一个数据,但由于“nil”之后没有 next 之类的东西而引发错误。

    至于销毁流的正确方法,我认为您使用的方式是正确的方法(我对highland.js不是很熟悉,所以这只是基于阅读文档和熟悉javascript一般),只是效果不一定是您所期望的。我不希望破坏 output 来破坏管道,这是因为管道“属于”input,因为它被称为反对。如果你想破坏你的管道,我想这样做的方法是调用

    input.destroy()
    

    改为(或者实际上,以及 output.destroy(),因为您不想留下松散的结局!)。文档声明您应该在任何手动构建的流上调用 destroy() 或 .end()(就像您在上面所做的那样)。

    这样想。如果我有一个源正在管道到一个目的地,并且我删除了那个目的地,我当然会得到一个错误,因为我的输入无处可去,我的输出流将告诉其他一切它结束了。如果你想销毁管道,销毁源更有意义,如果你停止输出/目标,你需要找到其他地方让你的输入去!

    【讨论】:

    • 嗯……好吧,这就解释了。谢谢你到目前为止:-)。问题是:我怎样才能销毁输出并保留输入流,因为我仍然需要它? OTOH 文档明确指出 destroy() 还将从任何源中删除流,因此这听起来好像您也应该能够以这种方式从源流中取消管道。
    • 现在是问问自己要达到什么目标的好时机!可以将管道重定向到新的输出吗?老实说,我不能断然地说,但问题是,你需要吗?一旦你在输出上调用 .destroy() ,它就不再存在了,所以你需要对你的输入管道做一些事情。您可以尝试定义一个新输出并在该新输出的输入上重新调用 .pipe,看看那里会发生什么。或者您可以重新考虑首先销毁输出。你能重新定义它的作用吗?或者你甚至应该重用输入?应该把它们全部结束并从一个新的集合开始吗?
    猜你喜欢
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2014-07-29
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    相关资源
    最近更新 更多