redux-saga - 如何处理多次调用回调的API方法

时间:2017-05-30 12:26:06

标签: javascript reactjs callback react-redux redux-saga

我有外部API,有这样的方法 watchForEvents(callback)callback应该是一个函数function(result, error) {...}。 回调多次调用 - 一次由API生成的每个事件。方法watchForEvents是非阻塞的。

我有一个使用redux-saga的React.JS应用。我无法弄清楚如何处理这样的API。

如果我调用API方法并延迟我的传奇 - 一切正常。即yield call(delay, 10000);。但是没有延迟,saga吞下了回调的所有调用。

我该怎么办?

2 个答案:

答案 0 :(得分:3)

Redux传奇channels非常适合这种情况,例如

import { eventChannel, END } from "redux-saga";
import { call, put, take } from "redux-saga/effects";

function yourChannel(action) {
  return eventChannel(emitter => {
    watchForEvents(function(result, error) {
      if (error) {
        throw new Error(error);
      } else {
        emitter(result);
      }
    });
  });
}

function* yourSaga(action) {
  const chan = yield call(yourChannel, action);
  try {
    while (true) {
      const result = yield take(chan);
      console.log(result); // will log on every event
    }
  } catch (err) {
    // catch error here
  } finally {
    // if you do emitter(END) inside your channel, you know here that the channel has terminated
  }
}

答案 1 :(得分:1)

我对此有一些经验,我所做的是创建一个事件发射器,该事件发射器将为我的回调函数的每次调用发射一个事件。然后在redux-saga上,只需在该事件发射器周围创建一个事件通道即可。

我已经创建了我的方法的样本要点,以及之前的用例。希望它能对您有所帮助:https://gist.github.com/aamiel16/75c1cd3fd1d9ef873a88dcf4dd86e00d

如果有任何疑问,我很乐意跟进有关这些问题的答案。