所以我试图在 webpack 中使用 redux thunk 进行异步调用,但收到一条奇怪的消息 - 'await' 只允许在异步函数中和模块的顶层
export const createPost = (post) => async => (dispatch) => {
try {
const { data } = await api.createPost(post);
dispatch({ type: "CREATE", payload: data })
} catch(error) {
console.log(error.message)
}
}
初始 webpack 配置
const path = require("path");
module.exports = {
devServer: {
contentBase: path.resolve(__dirname, "./src"),
historyApiFallback: true,
},
entry: [
"regenerator-runtime/runtime",
path.resolve(__dirname, "./src/index.js"),
],
module: {
rules: [
{
test: /\.js?$/,
exclude: /node_module/,
use: "babel-loader",
},
{
test: /\.css?$/,
use: ["style-loader", "css-loader"],
},
{
test: /\.(png|j?g|svg|gif)?$/,
use: "file-loader",
},
],
},
output: {
filename: "bundle.js",
},
};
我试图通过添加插件“@babel/plugin-syntax-top-level-await”来更改 webpack 配置以对其进行排序,但现在它给了我一个不同的错误,我认为我没有正确添加它。应该更新加载器以允许通过 module.rules 中的加载器选项传递选项。在加载器更新之前,可以使用 LoaderOptionsPlugin 将这些选项传递给加载器: plugins: [
new webpack.LoaderOptionsPlugin({
// test: /\.xxx$/, // may apply this only for some modules
options: {
experiments: …
}
})
]
const path = require("path");
module.exports = {
devServer: {
contentBase: path.resolve(__dirname, "./src"),
historyApiFallback: true,
},
entry: [
"regenerator-runtime/runtime",
path.resolve(__dirname, "./src/index.js"),
],
experiments: {
topLevelAwait: true,
},
module: {
rules: [
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
exclude: /node_module/,
use: {
loader: "babel-loader",
options: {
plugins: ["@babel/plugin-syntax-top-level-await"],
},
},
},
{
test: /\.css?$/,
use: ["style-loader", "css-loader"],
},
{
test: /\.(png|j?g|svg|gif)?$/,
use: "file-loader",
},
],
},
output: {
filename: "bundle.js",
},
};
我认为您声明函数的方式存在问题,这就是您所拥有的:
export const createPost = (post) => async => (dispatch) => {
...
}
我认为你需要的是
export const createPost = post => async (dispatch) => {
...
}
问题是实际执行异步操作的函数是这样的:
(dispatch) => { }
但是您将 async 关键字放在上一级的包装箭头函数上:
async => (dispatch) => { ... }
我还没有看过你的 webpack 配置,所以不确定那里是否也有问题
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句