我对这个框架比较陌生,我正在尝试创建驱动程序。我理解这段代码:
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 :(得分:1)
来自HTTP的select
方法不是来自xstream
,它是由HTTP驱动程序实现并返回的方法(您可以在此处查看该方法的实现:{{3} })
因此,如果您认为需要select
方法(如果必须过滤套接字源),可以在驱动程序中自己实现它并将其返回到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方法!
select
或多或少是一种惯例,允许您根据生成该来源的接收器过滤来源。
例如,您的某个组件发出类别为doThing
的HTTP请求,然后在该组件中,您可能希望select
具有doThing
类别的响应。< / p>
在您的情况下(套接字驱动程序),没有请求 - 响应模式。接收器和源之间没有明显的链接(您可以触发不发送任何响应消息的消息,并且您可以接收未与您发送的任何消息相关联的响应消息)。
所以,如果我是你,我会使用你的驱动程序返回的incoming$
(并最终在你的组件中过滤掉),就像这样
function component({ socket }) {
/* here `socket` is the `incoming$` you return in the `sockDriver`
const socketData$ = socket.filter(data => /* predicate here */);
return {
/* sinks */
}
}