Получение ошибки с функцией без обещаний внутри цепочки обещаний - PullRequest
0 голосов
/ 04 марта 2020

В сторонней кодовой базе я нашел цепочку обещаний:

const signUp = ({ dispatch, commit, getters }, payload) => {
  return dispatch('startTask', { id: signUpRequestTaskId }, { root: true })
    .then(() => enrichSignUpPayload(payload, getters))
    .then(apiRequest.signUpB2b);
};

Для решения определенной проблемы в приложении мне нужно удалить первое звено цепочки (dispatch('startTask',...root: true })):

const signUp = ({ dispatch, commit, getters }, payload) => {
  return enrichSignUpPayload(payload, getters)
    .then(apiRequest.signUpB2b);
};

Однако это вызывает следующую ошибку:

enrichSignUpPayload (...). Тогда это не функция

Почему? До удаления первой ссылки не было ошибок, так почему вторая ссылка становится проблемой сейчас? Я не понимаю.

Вот тело функции enrichSignUpPayload() на всякий случай:

const enrichSignUpPayload = payload => pipe(
  payload,
  (p) => ({ ...p, fromApp: isFromApp() }),
  aperoFromStorage
);

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Вы получаете эту ошибку, потому что enrichSignUpPayload не возвращает promise, как dispatch. Кроме того, первая версия signUp работает, потому что вызов promise.then также возвращает promise, так что мы можем вызвать следующий .then на нем. Обратитесь к this для получения дополнительной информации об этом.

Я полагаю, чтобы заставить вещи работать, вы могли бы сделать что-то вроде:

const enrichSignUpPayload = payload => pipe(
  payload,
  (p) => ({ ...p, fromApp: isFromApp() }),
  aperoFromStorage,
  (possibleValueFromAperoFromStorage) => Promise.resolve(possibleValueFromAperoFromStorage)
);

Или, если enrichSignUpPayload не asyn c вы можете просто сделать:

const signUp = ({ dispatch, commit, getters }, payload) => {
  const result = enrichSignUpPayload(payload, getters);
  return apiRequest.signUpB2b(result)
};
0 голосов
/ 04 марта 2020

enrichSignUpPayload не возвращает обещание.

Вы можете обернуть результат, используя Promise.resolve:

const signUp = ({ dispatch, commit, getters }, payload) =>
    Promise.resolve(enrichSignUpPayload(payload, getters))
        .then(apiRequest.signUpB2b)
0 голосов
/ 04 марта 2020

Вы пытались добавить функцию для возврата

const signUp = ({ dispatch, commit, getters }, payload) => {
  return () => enrichSignUpPayload(payload, getters) // Here add function
    .then(apiRequest.signUpB2b);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...