Задать вопрос
@Swaerok

Почему так работает?

export const fetchTodos = (page: number = 1, limit: number = 10) => {
  return async (dispatch: Dispatch<TodoAction> ) => {
    try {
      dispatch({type: TodoActionTypes.FETCH_TODOS});
      const responce = await axios.get('https://jsonplaceholder.typicode.com/todos', {
        params: {_page: page, _limit: limit}
      });
      dispatch({type: TodoActionTypes.FETCH_TODOS_SUCCESS, payload: responce.data})
    } catch (error) {
      dispatch({type: TodoActionTypes.FETCH_TODOS_ERROR, payload: 'Erorrr1rr1r1'})
    }
  }
}

Вот функция fetchTodos, она возвращает функцию, т.е. чтобы её использовать, нужно сначала вызвать fetchTodos

const {fetchTodos} = useAction()
const pages = [1,2,3,4,5]
  useEffect(() => {
    fetchTodos(page,limit)
},[])


Вот так она используется, она просто вызывается и срабатывает как надо, можете объяснить почему?Я знаю, чтобы использоваться функцию, которую возвращает другая функция, нужно присвоить переменной результат функции fetchTodos, let res = fetchTodos(a,b), и только потом res() делать, но тут просто вызывается fetchTodosю

Код с видео, но хотелось бы понять почему так работает
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 1
black1277
@black1277
Вольный стрелок
Потому что useAction() возвращает не ту же самую функцию, а функцию забинденную на dispatch и выглядит это примерно вот так:
function bindActionCreator(actionCreator, dispatch) {
  return function () {
    return dispatch(actionCreator.apply(this, arguments));
  };
}

то есть по ключу fetchTodos лежит уже вызванная функция bindActionCreator(fetchTodos, dispatch) , и вызывая fetchTodos вы по сути вызываете вот этот участок:
function () {
    return dispatch(actionCreator.apply(this, arguments));
  };

надеюсь, понятно объяснил. Но лучше вывести самому в консоль лог и изучить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы