2016-08-25 26 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組件

  • 斯坦加和同類者