Цепочка обещаний не может принимать мои параметры

У меня проблема с цепочкой обещаний, которым назначены параметры:

вот моя начальная цепочка:

dispatchTermsCondition(history, dispatch)
        .then((history, dispatch)=>
             dispatchSetPrivacy(history, dispatch)
         )
         .then(()=>
                dispatcherUserTermsPrivacy(history,dispatch, getState,response.data.tj_id)
          );

Первая цепочка работает нормально, а когда доходит до второй, она не может найти параметры, которые я ей отправил. Вот моя вторая функция (dispatchSetPrivacy):

export function dispatchSetPrivacy(history, dispatch) {
return axios.get("some url")
    .then((response) => {
        dispatch({
            type: SET_PRIVACY,
            payload: {
                privacy: {id: response.data.id, content: response.data.content, version: response.data.version }
            }
        });

    }).catch(function(response){


        console.info(response);
        history.push("/error");
    });
 }

Вот ошибка, которую я получаю:

TypeError: dispatch is not a function at bundle.js:76071

и это происходит в dispatchSetPrivacy.

Любая идея?

Прежде всего, я бы сказал, что вам не хватает операторов возврата перед dispatchSetPrivacy и dispatcherUserTermsPrivacy.

Gnujeremie 07.06.2018 17:33

Обратный вызов then принимает только один аргумент. Используйте только history => вместо (history, dispatch)=> и возьмите dispatch из окружающей среды.

Bergi 07.06.2018 17:33

@Gnujeremie Нет, возврат неявный в стрелочных функциях без тела блока

Bergi 07.06.2018 17:33

@Bergi да ладно, я не заметил. Я привык писать блочные тела даже для простой отдачи.

Gnujeremie 07.06.2018 17:34

Доступ к history в вызове dispatcherUserTermsPrivacy работать не будет. См. Как мне получить доступ к предыдущим результатам обещания в цепочке .then()?

Bergi 07.06.2018 17:35

@Bergi, но мне нужна отправка

Hamed Minaee 07.06.2018 17:35

@HamedMinaee У вас есть dispatch. Но не в результате звонка dispatchTermsCondition.

Bergi 07.06.2018 17:36

Вы ничего не возвращаете в аксиомах. Тогда, конечно, следующий не имеет параметров. Но я не уверен, почему вы передаете отправку в цепочке dispatchTermsCondition, разве она не доступна во внешней функции? Похоже, что в любом случае доступны redux-thunk, dispatch и getState, вы назначили их параметрам then, когда они уже были определены внешней функцией, которая является анти-шаблоном и здесь тоже не нужна. Было бы проще, если бы вы опубликовали все действие thunk, чтобы увидеть это.

Dominic 07.06.2018 17:44

Можете ли вы показать окружающий код? Любой импорт, объявление параметров, инициализация и т. д.?

J. Pichardo 07.06.2018 17:51

@DominicTobias, плохо, вы правы, пожалуйста, добавьте это в качестве ответа, я приму это

Hamed Minaee 07.06.2018 18:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
10
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, эта строка:

.then((history, dispatch) =>
  dispatchSetPrivacy(history, dispatch)
)

Вернет результат dispatchSetPrivacy, но в .then ничего не возвращается, поэтому не будет никаких параметров. Если вы хотите передать параметры, передайте что-нибудь в return, например:

export const dispatchSetPrivacy = (history, dispatch) =>
    axios.get("some url")
      .then((response) => {
        dispatch({
          type: SET_PRIVACY,
          payload: {
            privacy: { id: response.data.id, content: response.data.content, version: response.data.version }
          }
        });
        return response;
      })
      ...

Нет необходимости передавать отправку и историю, поскольку они доступны из верхней области (преобразователь redux), и вы должны просто иметь возможность использовать их оттуда:

const yourThunk = (history, otherArg) => (dispatch, getState) => {
  dispatchTermsCondition(history, dispatch)
    .then(() =>
      dispatchSetPrivacy(history, dispatch)
    )
    .then((response) =>
      dispatcherUserTermsPrivacy(history, dispatch, getState, response.data.tj_id)
    );
};

Обратите внимание: не совсем уверен, исходит ли история из модуля или из параметров, но вы поняли!

Другие вопросы по теме