Redux-сага отмена задачи - PullRequest
0 голосов
/ 09 мая 2018

У меня серьезные проблемы с отменой этой задачи. Он находится внутри небольшого цикла и работает нормально, если я использую takeLatest внутри аккумулятора в нижней части функции. Ничего не происходит / функция flowControl не запускается, если я использую take.

Действие отмены запускается, но задача продолжает выполняться - это проблема с использованием while? Это еще одна проблема, которую я не вижу?

Если проблема заключается в экспорте этого потока с использованием *appRoot внизу страницы, как правильно включить управление потоком в хранилище React / Redux?

function* install() {
  const items = list.length - 1; // total number of things to call
  let count = 1;

  while (count < items) {
    const response = yield call(() => Promise.resolve(list[count]));
    if (response && !response.error) {
      yield put({type: LOAD_ITEM_SUCCESS, item: response.data});
      console.log('success, created new item', response.data);
    }
    yield delay(5000);
  }
}

export function* flowControl() {
  while ( true ) {
    // starts the task in the background
    const task = yield fork(install);
    // wait for the user stop action
    yield take(CANCEL_ACTION, cancelInstall, task);
  }
}

function* cancelInstall(task){
  yield cancel(task);
}


export default function* appRoot() {
  yield all([
    takeLatest(LOAD_ITEMS, flowControl)
  ]);
}

Обновление Для Других Пост-Резиновых Уток Здесь:

  • Проблема 1: цикл while внутри flowControl не фальсифицируется, поэтому он работает вечно
  • Проблема 2: take работает не так, как ожидалось, но замена на takeLatest корректно вызывает функцию отмены.

Хотя присутствует в демках , цикл while не имеет фальсифицируемого состояния, поэтому он просто ... работает. Кучка! Я не уверен почему, но удаление FlowControl while и замена отмены take на takeLatest делает этот поток работающим, как и ожидалось.

1 Ответ

0 голосов
/ 10 мая 2018

take получает один аргумент.

Повторите попытку с этим изменением:

export function* flowControl() {
  while ( true ) {
    // starts the task in the background
    const task = yield fork(install);
    // wait for the user stop action
    yield take(CANCEL_ACTION); // <-
    yield call(cancelInstall, task); // <-
  }
}
...