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

时间:2020-03-04 12:32:08

标签: javascript ecmascript-6 promise

在第三方制作的代码库中,我找到了这个承诺链:

gcloud compute instances create-with-container [INSTANCE_NAME] \
     --container-image [DOCKER_IMAGE]

要解决应用程序中的某个问题,我需要删除链的第一个链接(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(...)。那么它不是一个函数

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

这里是const signUp = ({ dispatch, commit, getters }, payload) => { return enrichSignUpPayload(payload, getters) .then(apiRequest.signUpB2b); }; 函数的正文,以防万一:

enrichSignUpPayload()

3 个答案:

答案 0 :(得分:1)

您收到此错误消息是因为enrichSignUpPayload不会像promise那样返回dispatch。同样,第一个signUp版本也可以使用,因为对promise.then的调用还会返回一个promise,因此我们可以在其上调用下一个.then。有关更多信息,请参见this

我认为,要使工作正常,您可以执行以下操作:

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)
};

答案 1 :(得分:0)

您尝试添加返回函数

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

答案 2 :(得分:0)

enrichSignUpPayload没有返回承诺。

您可以使用Promise.resolve包装结果:

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