如何在 yield call(..) 之前检查前提条件

How to check precondition before yield call(..)

我有一个处理将文件上传到我的服务器的传奇。观察者由多个 Redux 操作之一触发:

观察者暂时使用 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)]);
        }
    }