Итак ... Redux - это синхронизация действий или синхронизация?(Без сана или саги) - PullRequest
0 голосов
/ 24 сентября 2019

Меня немного смущает поведение, когда я отправляю redux действие.

Пример:

onPressAdd() {
    this.props.addFloor({
        name: this.state.floor_name,
    });
    console.log(this.props.floors);
}

Я вызываю избыточное действие addFloor, что добавляетпол в массив в хранилище, затем я console.log этой переменной, и я ожидаю обновленное состояние ([{name:'whatever'}]), но я получаю [] (пустой массив)

Пример 2:

async onPressAdd() {
    await this.props.addFloor({
        name: this.state.floor_name,
    });
    console.log(this.props.floors);
}

В этом примере я получаю прекрасно обновленное хранилище: [{name:'whatever'}]

Я читаю везде, что «Redux Actions диспетчеризация синхронизируется, если нет thunk или саги (Прямой путь:диспетчерское действие-> уменьшить-> сохранить ", но это доказательство того, что отправления являются АСИНБ.

Так где же правда?

1 Ответ

3 голосов
/ 24 сентября 2019

Отправка сама по себе на 100% синхронна.

Это крошечная реализация хранилища Redux:

function createStore(reducer) {
    var state;
    var listeners = []

    function getState() {
        return state
    }

    function subscribe(listener) {
        listeners.push(listener)
        return function unsubscribe() {
            var index = listeners.indexOf(listener)
            listeners.splice(index, 1)
        }
    }

    function dispatch(action) {
        state = reducer(state, action)
        listeners.forEach(listener => listener())
    }

    dispatch({})

    return { dispatch, subscribe, getState }
}

К моменту возврата dispatch() хранилище выполнило вашу функцию-редуктор и вызвало все обратные вызовы подписчика хранилища.

Только когда вы начнете добавлять промежуточное ПО в хранилище, процесс отправки может быть прерван, потому что любое промежуточное ПО может задержать, остановить или перезаписать любое отправленное действие.

То, что вы видитев этом примере фактически основан на том, как работает React.Внутри этого обработчика кликов React еще не перерисовал и не обновил реквизиты компонента, поэтому this.props.whatever останется прежним до и после отправки.

...