1

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

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

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

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函数包装成一个承诺,然后使用,Rx.Observable.fromPromise但我想以反应的方式来做。

4

2 回答 2

2

我建议你做的是编写你的 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' })
}
于 2017-05-16T12:28:00.183 回答
0

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

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

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

于 2017-05-16T10:13:30.810 回答