0

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

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

1 回答 1

1

来自 HTTP的select方法不是来自于xstream,它是由 HTTP 驱动程序实现并返回的方法(您可以在此处查看该方法的实现:https ://github.com/cyclejs/cyclejs/blob/462e53a67e05d48091c002f004e51ae1f322f7a3/http /src/MainHTTPSource.ts#L20 )

所以,如果你觉得你需要一个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或多或少是一种约定,允许您根据生成该源的接收器过滤源

例如,您的一个组件发出一个带有类别的 HTTP 请求,doThing然后在该组件中,您可能想要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 */
  }
}
于 2017-09-10T11:06:31.200 回答