Dva: @云谦 如何轮询 yield call(api,param ),用setInterval 会提示语法错误

Created on 8 Nov 2016  ·  10Comments  ·  Source: dvajs/dva

例如 setInterval(function(){yield call(api,param)},1000)

question

Most helpful comment

const delay = timeout => {
  return new Promise(resolve => {
    setTimeout(resolve, timeout);
  });
};

All 10 comments

怎么才可以轮询接口,如果不用yield 会导致我操作不了state

while (true) {
  yield call(delay, 1000);
  yield call(api, params);
}

这样写 delay会报undefind 是在redux-saga的utils中,那dva该如何引入delay

const delay = timeout => {
  return new Promise(resolve => {
    setTimeout(resolve, timeout);
  });
};

我们项目目前都用dva重构了,现在遇到这问题,小弟在此谢谢谦哥啦

刚试了,好用了,太感谢了 @sorrycc !!!

@sorrycc 页面上有个操作想终止这个轮询,请问该怎么处理呢?

hi,
关于saga的effect处理有没有详细的教程呢?我遇到同样的问题,比如终止轮询、重新运行等,简单的方法可以用flag来检测,另外还有cancel,fork,takeLatest,这些不知道大家能给一些例子学习下?
谢谢。

@sorrycc 再请问一下,如果这样的话,如果才能在触发某些事件的时候停止循环呢?

需要用 redux-saga 的 fork 来处生成一个 Task,在需要的时候取消 Task 即可。

    * forkInterval(actions, { fork, cancelled, put }) {
      globalInterval = yield fork(function* () {
        try {
          while (true) {
            yield delay(3000);
            yield put({ type: 'youraction'  });
          }
        } finally {
          if (yield cancelled()) {
            // 取消之后的操作,这里什么都不做
          }
        }
      });
    },

    * clearInterval(actions, { cancel }) {
      yield cancel(globalInterval);
    },
Was this page helpful?
0 / 5 - 0 ratings