Отправка lodash throttle redux Uncaught TypeError: Ожидаемая функция

TL;DR Я сталкиваюсь со странностью при создании функции регулирования, где мне нужно вручную передать параметры этому методу при создании функции регулирования. Я могу сделать это, изменив исходную функцию, но я не хочу делать это для всех моих старых создателей функций / создателей действий.

Функция передается на газ:

Примечание: это создатели избыточных действий.

const changeValue = (value: string, otherValue?: boolean) => {
    return {
        type: "SOME_TYPE",
        payload: {
            value: value,
            otherValue: otherValue || false
        }
    };
};

Создание дроссельной функции:

const throttledMethod = (value: number, otherValue:boolean ) => {
    throttle(changeValue(Number(value),otherValue), 175, { "trailing": false });
};

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

Произошла ошибка:

node_modules\lodash\throttle.js:56 Uncaught TypeError: Expected a function
    at throttle (node_modules\lodash\throttle.js:56)

Когда break указывает на строку 56 в lodash и проверяет, мы видим, что значение объекта возвращается из valueChanged:

{
    type: "SOME_TYPE",
    payload: {
    value: value,
    otherValue: otherValue || false
}

Это все достаточно справедливо.

Странность в том, что мы заставляем это работать, выполняя довольно грязную ручную работу в создателе действий Redux. Я называю это грязным, потому что я не хочу менять всех своих старых создателей старых действий на эту новую вещь, которую я делаю.

Когда я вручную оборачиваю свой создатель действий, используя метод отправки Redux.js, все начинает работать как положено:

const changeValue = (value: string, otherValue?: boolean) => {
    return function (dispatch) {
        dispatch({
            type: "SOME_TYPE",
            payload: {
                value: value,
                otherValue: otherValue || false
            }
        });
    };
};

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

Возможно, мы можем создать оболочку, которая обрабатывает отправку вручную при передаче в lodash throttle или другими методами. Я думаю, что-то подобное было бы идеально, но не представляю, как будет выглядеть эта обертка.

Возможно, это то, о чем я мог бы спросить авторов, но сначала я хотел попробовать "userland".

1 ответ

Решение

Во-первых, вы можете заставить работать газ, заключив вызов в анонимную функцию:

const throttledMethod = (value: number, otherValue: boolean) => {
    throttle(
        () => changeValue(Number(value), otherValue), 
        175, 
        { "trailing": false }
    );
};

Тем не менее, призывая throttledMethod() просто вызову throttle который возвращает удушенную версию changeValue, Это не вызывает результирующую удушенную функцию. Дополнительно, changeValue это просто создатель действия - на самом деле он ничего не делает.

Ваш второй создатель действий, который возвращается (dispatch) => {} использует Redux-Thunk. Это хорошо, потому что нам это понадобится.

Вы можете получить функциональность, которую вы ищете с этим:

// we only want to set up the throttling once
const throttledChangeValue = throttle(
    (dispatch, value, otherValue) => dispatch(changeValue(Number(value), otherValue)), 
    175, 
    { "trailing": false }
);

// this is using thunk to dispatch the throttled action
const throttledPayOff = (value, otherValue) => dispatch => throttledChangeValue(dispatch, value, otherValue);
Другие вопросы по тегам