如何在yield调用之前检查前置条件(..)

时间:2017-05-19 14:14:21

标签: redux-saga

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

  • FILE_PROCESS_SUCCESS:成功处理文件(即调整图像大小)
  • NETWORK_INTERNET_ON:中断后建立Internet连接。

观察者暂时使用传奇助手 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
  );
}

2 个答案:

答案 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);  
  }
}

Saga docs

中描述的原始油门功能

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)]);
        }
    }