У меня есть вложенный yield call, который я хочу запустить по таймеру в своей саге. Однако по какой-то причине таймер не срабатывает и showModal не вызывается. Любая идея, почему это?
function* showModal() {
yield put(showPermissionsNeededWall('Please sign in', null));
readTimeLoginBoxShown();
}
export default function* showPermissionWall() {
yield takeLatest(SHOW_TIMED_LOGIN_WALL, function* () {
const { auth } = yield select(state => state);
if (!auth.currentUser) {
// yield showModal(); // works
yield call(setTimeout, function* () {
yield showModal(); // never fires
}, 1000 * SHOW_LOGIN_WALL_AFTER_IN_SECONDS);
}
});
};



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Во-первых, вы должны вызвать функцию генератора showModal напрямую с помощью call или вы должны put то действие, которое вызовет ваш showModal с помощью takeLatest.
Итак, каждый раз, когда вы хотите вызвать showModal:
yield call(showModal);
С другой стороны, в контексте саги вы должны использовать delay из redux-saga/effects.
В этом случае я бы использовал это:
yield call(delay, 1000 * SHOW_LOGIN_WALL_AFTER_IN_SECONDS);
yield call(showModal);
Все это вместе:
import { call, put, takeLatest } from 'redux-saga/effects';
export default function* showPermissionWall() {
yield takeLatest(SHOW_TIMED_LOGIN_WALL, function* () {
const { auth } = yield select(state => state);
if (!auth.currentUser) {
yield call(delay, 1000 * SHOW_LOGIN_WALL_AFTER_IN_SECONDS);
yield call(showModal);
}
});
};
Спасибо Рыцарь! Очень признателен