Javascript 在承诺链中使用非承诺函数获取错误

Javascript 在承诺链中使用非承诺函数获取错误,javascript,ecmascript-6,promise,Javascript,Ecmascript 6,Promise,在第三方制作的代码库中,我发现了以下承诺链: const signUp = ({ dispatch, commit, getters }, payload) => { return dispatch('startTask', { id: signUpRequestTaskId }, { root: true }) .then(() => enrichSignUpPayload(payload, getters)) .then(apiRequest.signUpB2

在第三方制作的代码库中,我发现了以下承诺链:

const signUp = ({ dispatch, commit, getters }, payload) => {
  return dispatch('startTask', { id: signUpRequestTaskId }, { root: true })
    .then(() => enrichSignUpPayload(payload, getters))
    .then(apiRequest.signUpB2b);
};
为了解决应用程序中的某个问题,我需要删除链的第一个链接(
dispatch('startTask',…root:true})
):

但是,这会触发以下错误:

enrichSignUpPayload(…)。then不是函数

为什么??在我删除第一个链接之前没有错误,那么为什么第二个链接现在会成为问题呢?我不明白

以下是
enrichSignUpPayload()
函数的主体,以防万一:

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

您是否尝试添加要返回的函数

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

出现此错误是因为
enrichSignUpPayload
不像
dispatch
那样返回
承诺
。另外,第一个版本的
注册
之所以有效,是因为对
承诺的调用。然后
也会返回一个
承诺
,这样我们就可以调用下一个
。然后
。有关详细信息,请参阅

我想,为了让事情顺利进行,你可以做如下事情:

const enrichSignUpPayload = payload => pipe(
  payload,
  (p) => ({ ...p, fromApp: isFromApp() }),
  aperoFromStorage,
  (possibleValueFromAperoFromStorage) => Promise.resolve(possibleValueFromAperoFromStorage)
);
或者,如果
enrichSignUpPayload
不是异步的,您只需执行以下操作:

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

enrichSignUpPayload
未返回承诺

您可以使用以下方法包装结果:


应用@streletss的第一个解决方案是可行的,但他的第二个解决方案与您的解决方案一样,似乎可以在不经过所有步骤的情况下立即解决问题。知道为什么吗?第一个解决方案很有效,非常感谢,但是第二个看起来更好。然而,出于某种原因,当我这样做时,承诺链似乎会立即解决,而无需通过所有链接。知道为什么吗?正如回答中提到的,
enrichSignUpPayload
应该是同步的,以使第二个解决方案正常工作。据我所知,它是同步的,在
aperoFromStorage
中看不到任何异步API调用,
isFromApp()
也肯定是同步的。嗯,它应该可以工作。。你在说什么承诺链?在第二个解决方案中看不到链
const signUp = ({ dispatch, commit, getters }, payload) => {
  const result = enrichSignUpPayload(payload, getters);
  return apiRequest.signUpB2b(result)
};
const signUp = ({ dispatch, commit, getters }, payload) =>
    Promise.resolve(enrichSignUpPayload(payload, getters))
        .then(apiRequest.signUpB2b)