【发布时间】:2019-08-09 17:21:37
【问题描述】:
我遇到了我认为可能是错误但可能是我的理解的问题。
基本上import 的async action 在Redux 容器内返回未定义,但我知道导入很好(文件存在,它是正确的大小写等)。
仔细观察,当我迁移到容器中的速记对象表示法时,问题似乎已经开始,这是一个示例:
thunks.js
import { anAsyncFunc } from './anotherFile'
export const aThunk = () => async (dispatch, getState) => {
await dispatch(anAsyncFunc)
return dispatch(someOtherAsyncFunc)
}
containerThatDoesntWork.js
import { aThunk } from './thunks.js'
import MyComponent from './MyComponent'
console.log(aThunk) // undefined
const mapDispatchToProps = {
aThunk
}
containerThatDoesWork.js
import { aThunk } from './thunks.js'
import MyComponent from './MyComponent'
console.log(aThunk) // undefined
const mapDispatchToProps = dispatch => ({
aThunk: () => {
console.log(aThunk) // return async function (dispatch, getState) { ... }
return dispatch(aThunk())
}
})
在这两种情况下,如果我在container 中的console.log(aThunk) 我得到未定义,我认为这与async 函数的模块分辨率有关?
但是,在第二个示例中,将导入显式包装在一个函数中,组件是快乐的,而简而言之,它不是(PropTypes 验证失败)。
有人知道解决这个问题的方法吗?还是对象速记符号中mapDispatchToProps 的限制?
【问题讨论】:
-
如果你在没有
async的情况下重写你的异步操作,它会起作用吗?另外,你能验证import { aThunk }确实导入了一些东西吗? -
我无法重新编写该特定操作以避免
async执行其操作,但同一组件中的其他非async操作绑定OK。我相信导入会返回一些东西,因为它奇怪地在其他文件中工作。这很可能与import分辨率有关,但我不知道为什么。正如我所说,我可以解决这个问题的唯一方法是将action包装在一个显式调用调度的函数中。 -
当意外发生时,根据定义,这意味着您的期望在某个地方是错误的。因此,仅出于调试目的,我建议您尝试本地化问题。如果
aThunk是undefined,当您将它提供给mapDispatchToProps时,将更容易找到问题。如果您可以尝试从您的操作中删除async只是为了进行调试,它也会使问题更加具体。 -
对不起,我应该更清楚。两个答案,1)如果我从操作中删除异步只是为了调试,它仍然不起作用。 2)如果我
console.log()mapDispatchToProps之前的函数是未定义的。然而,在 working 容器版本(包装在一个函数中)中仍然是这种情况,但此时它被传递给不再定义的组件。我认为这是因为导入最终会解决?而当包裹在函数中时,函数指向变量,而不是使用函数的值?
标签: reactjs redux async-await redux-thunk