【问题标题】:Response is undefined in promise.then() for nested object嵌套对象的 promise.then() 中未定义响应
【发布时间】:2020-06-08 06:31:19
【问题描述】:

我在 redux 调度中遇到了奇怪的行为。对于调度函数 res 未定义,但是对于控制台日志,该函数调用 res 上方的一行已正确记录。任何想法为什么会发生这种情况?

主要动作

export const uploadFiles = (files: File[], artworkId: string, fileType: string) => (
    (dispatch: Dispatch) => {
        files.forEach(file => {
            axios.post(
                `${my-api-route}, convertToFormDataFile(file, fileType))
                .then(res => {
                    console.log(res.data.data.id) //works
                    dispatch(uploadFileLimitedEditionSuccess(res.data.data.id, file, fileType))
                }) //does not work
                .catch(err => dispatch(uploadFileLimitedEditionFailure(err.response.data.errors[fileType === 'pdf' ? 'pdf' : 'file'], file.name, fileType)))
        })
    }
);

成功行动

const uploadFileLimitedEditionSuccess = (id: any, file: File, fileType: string):LimitedEditionActionType => ({
    type: LIMITED_EDITIONS_UPLOAD_FILE_SUCCESS,
    payload: {
        id,
        file,
        fileType
    }
});

【问题讨论】:

  • 你确定res.data.data.id 是正确的吗?可以显示res的内容吗?
  • 你已经标记了这个javascript,但它看起来更像typescript
  • 是的,抱歉,我刚刚更正了 console.log 中的消息。这个打印正确。我知道这是 Typescript,但错误不是来自打字,因此我认为 js 标签会更好。
  • 只需 console.log(res) 并确保您正确访问道具甚至更好,销毁它们。
  • 是的,响应具有所有属性。案例是调度以某种方式丢失 res 对象。更重要的是,在调试器中我发现它应该可以访问该对象。

标签: reactjs typescript react-redux axios redux-thunk


【解决方案1】:

如果对象引用丢失,只需传入值。另外,检查您传递给dispatch 的值 - 它必须是一个对象(请参阅https://redux.js.org/api/store/#dispatchaction

export const uploadFiles = (files: File[], artworkId: string, fileType: string) => (
    (dispatch: Dispatch) => {
        files.forEach(file => {
            axios.post(
                `${my-api-route}, convertToFormDataFile(file, fileType))
                .then(res => {
                    console.log('I got called!)
                    console.log(res)
                    console.log(res.data.data.id) //works
                    const id = res.data.data.id
                  const toDispatch = uploadFileLimitedEditionSuccess(id, file, fileType)
                  console.log(toDispatch)
                  dispatch(toDispatch)
                }) //does not work
                .catch(err => {
               console.log(err)
dispatch(uploadFileLimitedEditionFailure(err.response.data.errors[fileType === 'pdf' ? 'pdf' : 'file'], file.name, fileType))
          })
        })
    }
);

【讨论】:

  • 我以前试过这个,但不起作用。另外,我将变量(响应值)放在 console.log 中,它记录工作但调度没有
  • 问题可能出在uploadFileLimitedEditionSuccess then...
  • 据我所知,uploadFileLimitedEditionSuccess 在其参数未完全评估之前不会被调用。
  • dispatch 将对象作为参数:redux.js.org/api/store/#dispatchactionuploadFileLimitedEditionSuccess的返回值是多少?
  • 感谢您的提示。实际上,在将 console.log 放入 catch 块之后,我发现有一个非对象传递给需要对象的函数。经过进一步研究,我发现它是我的减速器中的 Object.entries。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多