如何在 yield call(..) 之前检查前提条件
How to check precondition before yield call(..)
我有一个处理将文件上传到我的服务器的传奇。观察者由多个 Redux 操作之一触发:
- FILE_PROCESS_SUCCESS: 成功处理文件(即调整图像大小)
- NETWORK_INTERNET_ON: 中断后获取 Internet 连接。
观察者暂时使用 saga 助手 effects.throttle。
如果文件准备好上传 (FILE_PROCESS_SUCCESS),即使没有互联网连接,也会调用保存功能。我在保存功能中做的第一件事是检查互联网,这样我就不会白白拨打 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
);
}
我解决了。但我欢迎对解决方案发表评论。这是一个好的解决方案吗?
我的油门发电机特别版:
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);
}
}
Saga 文档中描述的原始节流函数
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 呼叫。
我有一个替代方案,不是用于节流而是用于 NetInfo 检查,
const x = yield call(NetInfo.getConnectionInfo);
if(x.type !== "none"){
yield all([call(bestSellers), call(products)]);
}
}
我有一个处理将文件上传到我的服务器的传奇。观察者由多个 Redux 操作之一触发:
- FILE_PROCESS_SUCCESS: 成功处理文件(即调整图像大小)
- NETWORK_INTERNET_ON: 中断后获取 Internet 连接。
观察者暂时使用 saga 助手 effects.throttle。
如果文件准备好上传 (FILE_PROCESS_SUCCESS),即使没有互联网连接,也会调用保存功能。我在保存功能中做的第一件事是检查互联网,这样我就不会白白拨打 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
);
}
我解决了。但我欢迎对解决方案发表评论。这是一个好的解决方案吗?
我的油门发电机特别版:
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);
}
}
Saga 文档中描述的原始节流函数
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 呼叫。
我有一个替代方案,不是用于节流而是用于 NetInfo 检查,
const x = yield call(NetInfo.getConnectionInfo);
if(x.type !== "none"){
yield all([call(bestSellers), call(products)]);
}
}