我有一个传奇来处理文件上传到我的服务器。观察程序由多个Redux操作之一触发:
观察者暂时使用传奇助手 effects.throttle 。
如果文件准备好上传(FILE_PROCESS_SUCCESS),即使没有Internet连接,也会调用save-function。我在save-function中做的第一件事就是检查Internet,这样我就不会徒劳地进行API调用。
如果没有互联网,根本不调用保存功能会更好。我怎么能用ReduxSaga来实现呢?
我想要的是:由多个Redux操作之一触发的限制调用,但仅限于 isConnected = true 。
function* saveUnsavedFilesToServer(action) {
//Don't even bother to try saving if we don't have an Internet connection
let isConnected = yield call(NetInfo.isConnected.fetch);
if (!isConnected) return;
//..send files to server
}
function* watchToSaveFilesToServer() {
yield throttle(
1000,
[FILE_PROCESS_SUCCESS, NETWORK_INTERNET_ON],
saveUnsavedFilesToServer
);
}
答案 0 :(得分:1)
我解决了。但我欢迎对解决方案发表评论。这是一个很好的解决方案吗?
export function* throttleIfConnected(ms, pattern, task, ...args) {
const throttleChannel = yield actionChannel(pattern, buffers.sliding(1));
while (true) {
const action = yield take(throttleChannel);
const isConnected = yield call(NetInfo.isConnected.fetch);
if (isConnected) yield fork(task, ...args, action);
yield call(delay, ms);
}
}
https://redux-saga.js.org/docs/api/index.html#throttlems-pattern-saga-args
function* throttle(ms, pattern, task, ...args) {
const throttleChannel = yield actionChannel(pattern, buffers.sliding(1))
while (true) {
const action = yield take(throttleChannel)
yield fork(task, ...args, action)
yield call(delay, ms)
}
}
这似乎工作得很好。我继续做了 callIfConnected 。
export function* callIfConnected(task, ...args) {
let isConnected = yield call(NetInfo.isConnected.fetch);
if (isConnected) yield call(task, ...args);
}
每当涉及带API调用的生成器时,我都会使用 IfConnected 帮助程序。如果没有互联网,则无需尝试API调用。
答案 1 :(得分:0)
我得到了一个替代方案,不是为了节流,而是为了NetInfo检查,
const x = yield call(NetInfo.getConnectionInfo);
if(x.type !== "none"){
yield all([call(bestSellers), call(products)]);
}
}