我有外部API,有这样的方法
watchForEvents(callback)
,callback
应该是一个函数function(result, error) {...}
。
回调多次调用 - 一次由API生成的每个事件。方法watchForEvents
是非阻塞的。
我有一个使用redux-saga
的React.JS应用。我无法弄清楚如何处理这样的API。
如果我调用API方法并延迟我的传奇 - 一切正常。即yield call(delay, 10000);
。但是没有延迟,saga吞下了回调的所有调用。
我该怎么办?
答案 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
如果有任何疑问,我很乐意跟进有关这些问题的答案。