У меня серьезные проблемы с отменой этой задачи. Это внутри небольшого цикла, и он работает нормально, если я использую 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)
]);
}
Обновление для других пост-Rubber-Duck здесь:
- Проблема 1: Цикл while внутри
flowControl
не поддается фальсификации, поэтому он работает вечно - Проблема 2:
take
не работает должным образом, но замена его наtakeLatest
запускает функцию отмены должным образом.
Хотя присутствует в демонстрациях, цикл while
не получил фальсифицируемое состояние, поэтому оно просто... работает. Куча! Я не уверен, почему, но удаление FlowControl
while и замена отмены take
на takeLatest
заставляет этот поток работать так, как ожидалось.