Как узнать, вызвана ли функция внутри избыточной диспетчерской отправки? - PullRequest
0 голосов
/ 25 февраля 2019

Я пишу функцию для отправки запросов API.Когда я получаю ответ от этого API, я хочу отправить избыточное действие, если пользователь вызвал мою функцию в диспетчере, или просто ничего не сделал, если нет.Я использую redux thunk .

Сейчас я написал два отдельных метода для этого.

  1. Это не отправляется после полученияответ от API, просто вернуть обещание.
const getAnimalsList = () => return axios.request({url: 'api.domain.com/animals'});

Эта функция будет вызываться как обычные функции.

Он отправляет действие что-то после получения ответа от API
const getAnimalsList = () => (dispatch, getState) => {
    axios.request({url: 'api.domain.com/animals'}).then(
        res => dispatch({type: 'RESPONSE RECEIVED', data: res}),
        err => dispatch({type: 'ERROR', err})
    );
}

Эта функция будет вызываться внутри диспетчеризации как dispatch(getAnimalsList())

Теперь я хочу узнать в одной функции, была ли она вызвана внутри dispatch или просто вызвана нормально.

пример:

const getAnimalsLis = () => {
    let prom = axios.reques({url: 'api.domain.com/animals});
    if(function_is_called_inside_dispatch){
        return dispatch => {
            prom.then(
                res => dispatch({type: 'RESPONSE RECEIVED', data: res}),
                err => dispatch({type: 'ERROR', err})

            );
        }
    }
    else return prom;

}

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Пожалуйста, не определяйте getState, если вы не планируете его использовать:

const getAnimalsList = () => (dispatch, getState) => {
    axios.request({url: 'api.domain.com/animals'}).then(
        res => dispatch({type: 'RESPONSE RECEIVED', data: res}),
        err => dispatch({type: 'ERROR', err})
    );
}

А также используйте синтаксис async/await, более понятный для вас относительно того, что происходит:

export const getAnimalsList = () => async dispatch => {
  const response = await jsonAnimals.get("/animals");
  dispatch({ type: "RESPONSE_RECEIVED", payload: response.data });
};

Затем создайте папку / файловую систему следующим образом: apis/jsonAnimals.js:

Поместите туда свой код Axios:

import axios from 'axios';

export default axios.create({
    baseURL: 'http://api.domain.com'
});

Хорошо, теперь у вас естькрасивое чистое приложение Redux, облегчающее работу глаз, облегчающее отладку.

Теперь, если вы хотите протестировать его в консоли, вы можете сделать

export const testGetAnimalsList = () => async (dispatch, getState) => {
  await dispatch(getAnimalsList());
  console.log(getState().animals);
};

export const getAnimalsList = () => async dispatch => {
  const response = await jsonAnimals.get("/animals");
  dispatch({ type: "RESPONSE_RECEIVED", payload: response.data });
};
0 голосов
/ 25 февраля 2019

Это неправильный способ делать вещи.Нет способа обнаружить, что функция была вызвана как dispatch(getAnimalsList()) или просто getAnimalsList().Из-за приоритета оператора он уже был вызван как getAnimalsList(), когда действие предоставлено для dispatch.Единственным способом было бы назвать его по-другому: dispatch(getAnimalsList(CALLED_AS_AN_ACTION)).

Правильный способ - не смешивать функции, которые служат различным целям.Код можно сделать СУХИМ, чем есть, функция getAnimalsList уже содержит общий код, который можно извлечь в противном случае:

const getAnimalsList = () => return axios.request({url: 'api.domain.com/animals'});

const getAnimalsListAction = () => (dispatch, getState) => {
    return getAnimalsList().then(
        res => dispatch({type: 'RESPONSE RECEIVED', data: res}),
        err => dispatch({type: 'ERROR', err})
    );
}
...