Отправка 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);