У меня серьезные проблемы с отменой этой задачи. Он находится внутри небольшого цикла и работает нормально, если я использую 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
делает этот поток работающим, как и ожидалось.