Я использую промежуточное программное обеспечение redux-thunk для отправки создателям действий, которые возвращают функции, которые сами отправляют действия, например,
dispatch(doStuff())
function doStuff(){
return dispatch => {
dispatch(doMoreStuff());
dispatch(doEvenMoreStuff());
// etc.
};
}
Здесь может быть что-то асинхронное, но, по крайней мере, изначально оно генерирует синхронный «стек» действий. Таким образом, пользователь нажимает кнопку, это отправляет создателя действия, который запускает каскад других действий. Мой редуктор может быть вызван 10 раз подряд. Что я хочу сделать, так это запустить какую-то конкретную функцию с результирующим состоянием приложения в конце этой цепочки, как только это действие и все его непосредственные последствия будут выполнены.
Ленивый способ сделать это будет с setTimeout
в чем-то, что оборачивает мой редуктор:
let timeout;
export default function(state, action) {
const reduced = reducer(state, action);
if (timeout) clearTimeout();
timeout = setTimeout(() => doSomethingWithState(reduced), 0);
return reduced;
}
function reducer(state, action) {
// actual reducer
}
Но это не кажется великолепным и, вероятно, подвержено ошибкам. Каков наилучший способ сделать это, вызвать что-то в конце каждого стека действий, а не отдельного действия?