2017-09-09 64 views
0

我對這個框架比較陌生,並且試圖圍繞創建驅動程序發揮作用。我理解這個代碼:創建循環js驅動程序

import {adapt} from '@cycle/run/lib/adapt'; 

function makeSockDriver(peerId) { 
    let sock = new Sock(peerId); 

    function sockDriver(outgoing$) { 
    outgoing$.addListener({ 
     next: outgoing => { 
     sock.send(outgoing)); 
     }, 
     error:() => {}, 
     complete:() => {}, 
    }); 

    const incoming$ = xs.create({ 
     start: listener => { 
     sock.onReceive(function (msg) { 
      listener.next(msg); 
     }); 
     }, 
     stop:() => {}, 
    }); 

    return adapt(incoming$); 
    } 

    return sockDriver; 
} 

但是我還不確定是如何讓聽者(傳入$)採取的參數,如HTTP驅動程序:

const response$ = HTTP 
     .select('posts') 
+0

你計劃如何使用該參數在'進入$'? – bloodyKnuckles

回答

1

來自HTTP的select方法不來自xstream,它是實現並通過HTTP驅動程序返回的方法(你可以看到,這裏的方法的實現:https://github.com/cyclejs/cyclejs/blob/462e53a67e05d48091c002f004e51ae1f322f7a3/http/src/MainHTTPSource.ts#L20

所以,如果你覺得你需要一個select方法(如果你個人有T O過濾器的插口源),就可以實現它自己的驅動程序與您sockDriver功能

function makeSockDriver(peerId) { 
    let sock = new Sock(peerId); 

    function sockDriver(outgoing$) { 
    const incoming$ = /* ... */ 

    function select(category) { 
     const res$ = category ? 
     incoming$.filter(data => /* filter the data here */) : 
     incoming$; 

     return res$; 
    } 
    return { select }; // an object with the `select` method 
    } 

    return sockDriver; 
} 

話雖這麼說,回吧,我不認爲你需要一個選擇方法插口驅動器select或多或少是一種約定,它允許您根據生成該源的接收器過濾器源

例如,您的某個組件發出一個類別爲doThing的HTTP請求,然後在該組件中,您可能想要select具有doThing類別的響應。

在你的情況下(套接字驅動程序),沒有請求 - 響應模式。匯和源之間沒有明顯的聯繫(您可以觸發不會發送任何響應消息的消息,並且您可以接收與您發送的任何消息無關的響應消息)。

所以,如果我是你,我只希望使用您的驅動程序返回的incoming$(最終篩選出來在你的組件)這樣

function component({ socket }) { 
    /* here `socket` is the `incoming$` you return in the `sockDriver` 
    const socketData$ = socket.filter(data => /* predicate here */); 

    return { 
    /* sinks */ 
    } 
}