【问题标题】:Create observable from polling function从轮询函数创建 observable
【发布时间】:2017-05-16 09:15:59
【问题描述】:

我有一个函数可以在特定时间间隔执行一些数据。类似于轮询函数的东西:

function poll(handler) {
  setInterval(handler, 1000);  // Mocking network communication
}

所以我想在像这样的redux-observable epic 中使用该函数(后面是伪代码):

action$
  .filter(...)
  .map((action) => poll)
  .map(results from poll)

如何订阅轮询功能并使用 rxjs?

编辑:

我尝试过但失败了

function start() {
  return Rx.Observable.create((observer) => poll(observer.next));
}


function startProcess(action$) {
  return action$
    .filter((action) => action.type === 'START_PROCESS')
    .map((action) => start())
    .swipWhile((result) => result !== 'proceed')  // I only want to dispatch the next action after we get a `proceed` result from the polling function
    .map(() => ({ type: 'CAN_START_PROCESS' })
}

我可以将poll 函数包装成一个promise,然后使用Rx.Observable.fromPromise,但我想以反应的方式来做。

【问题讨论】:

  • 所以你想为每个动作注册一个新的轮询“looper”?
  • 基本上,我想听网络,直到收到proceed 消息。所以 redux 操作流程类似于:START_PROCESS -> 进入 redux 可观察史诗 -> 在这里我们监听可观察的轮询,直到我们继续进行 -> START_PROCESS_SUCCESS

标签: rxjs redux-observable


【解决方案1】:

我建议你做的是编写你的 poll 函数来返回一个 observable:

function createPoll$() {
  return Rx.Observable.interval(1000)
    .flatMap(makeRequest);
}

您的启动过程函数如下所示:

function startProcess(action$) {
  return action$
    .filter((action) => action.type === 'START_PROCESS')
    .switchMap(createPoll$)
    .filter(result => result === 'proceed') 
    .map(() => ({ type: 'CAN_START_PROCESS' })
}

【讨论】:

    【解决方案2】:

    好的,我让它将观察者绑定到自身:

    function start() {
      return Rx.Observable.create((observer) => poll(observer.next.bind(observer));
    }
    

    但仍然不知道使用已经创建的运算符是否有更好的解决方案。

    【讨论】:

      猜你喜欢
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多