2016-08-25 75 views
2

让我们想象一下,在面向对象的世界中,我想要构建一个侦听网络并让我与之交互的对象。这将继承一个EventEmitter,并会是这个样子:创建Cycle.js可重用模块

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()

这个面向对象方法的好处是我可以很容易地将这个功能打包在自己的npm模块中,测试地狱,并为用户提供一个漂亮的可重用API。

我的问题是,我如何通过Cycle.js应用程序实现这一目标?

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

回答

2

在我看来,你正在试图解决思考问题,因为你会写"imperative code"。 我认为使用自己的侦听器创建Torrent实例并不是您应该在循环组件中使用的东西。

我会以不同的方式去做 - 创建Torrent模块并找出它的源和汇。如果这个模块应该可重用并发布,你可以创建它作为一个函数,接收流作为参数。也许类似于TodoMVC Task component(然后在其父组件中使用)。

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

这个实现当然取决于你的需求,但是与模块的通信只能通过流进行,并且由于它是声明性的,所以不需要像你要调用的stop()和destroy()方法别处。

+0

是我觉得我在思考它存在的问题一个功能性的方式,而不是当务之急。所以你说我会有一个TorrentDriver,我可以发送资源并创建torrent实例?理解我的实际“洪流对象”在哪里会令人困惑。因为它需要存储在某个地方。 –

+0

这个函数(可能不是驱动程序)不会返回实例 - 这将是一种“功能方式”。它应该只返回您可以使用的流并对其做出反应。因此,源代码应该是创建种子(一些DOM事件或操作等)和接收器(返回流)的东西,可以是您可以在您的应用中使用的某种结果(流中用于在DOM中写入的视图或某些数据流)。这取决于你想要完成什么,但通常用于创建实例并像你想要的那样使用它们不是循环组件会做的事情...... – domagojk

0

我该如何测试它?

在cycle.js中,您将使用意向模型和视图函数编写一个组件。

你会测试意图(),对于给定的输入流,产生你想要的动作流。对于模型,你可以测试给定的http和action stream,你得到你想要的状态,并且为了查看,你测试给定一个状态你得到你想要的VDom。

cycle.js的一个棘手问题是,由于它传递函数,所以使用'this'关键字的普通JavaScript对象不值得因'this'上下文问题而导致麻烦。如果你正在使用cycle.js,并且你认为你可能写了一个JS类以便与Isolate,Onionify或Collections很可能一起使用,那么你会走错方向。见MDN docs about 'this'

我将如何去创造很多山洪

周期。人们有几种方式来处理这样的事情。 这ticket介绍了一些东西,可能对于工作:在Web组件

  • 斯坦加和同类者