2

让我们想象一下,在一个面向对象的世界中,我想构建一个Torrent对象来监听网络并让我与之交互。它将继承一个 EventEmitter 并且看起来像这样:

var torrent = new Torrent(opts)
torrent.on('ready', cb) // add torrent to the UI
torrent.on('metadata', cb) // update data in the UI

我也可以让它做一些事情:

torrent.stop()
torrent.resume()

当然,如果我想从内存中删除种子,我可以调用torrent.destroy().

这种 OO 方法很酷的一点是,我可以轻松地将这个功能打包到它自己的 npm 模块中,进行测试,并为用户提供一个干净、可重用的 API。

我的问题是,如何使用 Cycle.js 应用程序实现这一点?

如果我创建一个驱动程序,则不清楚我将如何创建许多种子并拥有自己的独立听众。还要考虑我想以一种其他人可以轻松地在其他 Cycle.js 应用程序中重用它的方式来打包功能。

4

2 回答 2

2

在我看来,您正在尝试解决一个问题,就像您编写“命令式代码”一样。我认为使用自己的侦听器创建 Torrent 实例不应该在循环组件中使用。

我会以不同的方式去做——创建 Torrent 模块并弄清楚它的来源和接收器是什么。如果这个模块应该是可重用和发布的,你可以将它创建为一个接收流作为参数的函数。可能类似于TodoMVC 任务组件(然后在其父组件中使用)。

由于这个模块可以创建为纯函数,因此测试它至少应该同样简单。

这种实现当然取决于您的要求,但是与模块的通信将仅通过流完成,并且由于它是声明性的,因此不需要您从其他地方调用的 stop() 和 destroy() 之类的方法。

于 2016-08-25T08:52:01.747 回答
0

我该如何测试它?

在 cycle.js 中,您将编写一个带有意图模型和视图功能的组件。

您将针对给定的输入流测试 intent(),生成您想要的操作流。对于模型,您将测试给定的 http 和操作流,您将获得所需的状态,而对于视图,您将测试给定的状态,您获得所需的 VDom。

cycle.js 的一个棘手之处在于,由于它传递函数,因此使用 'this' 关键字的普通 JavaScript 对象由于 'this' 上下文问题而不值得麻烦。如果您正在使用 cycle.js,并且您认为您可能会编写一个用于 Isolate、Onionify 或 Collections 的 JS 类,那么您走错了方向。参见MDN 文档关于 'this'

我将如何创建许多种子

Cycle.js 的人有几种方法来处理这样的一组事情。这张描述了一些可能适用的事情:

于 2017-04-06T17:55:33.697 回答