创建循环js驱动程序

时间:2017-09-09 10:13:02

标签: xstream cyclejs

我对这个框架比较陌生,我正在尝试创建驱动程序。我理解这段代码:

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

1 个答案:

答案 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 */
  }
}