首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reactjs: Uncaught :Object(.)(.).then不是函数

Reactjs: Uncaught :Object(.)(.).then不是函数
EN

Stack Overflow用户
提问于 2022-04-14 12:53:34
回答 2查看 1.3K关注 0票数 0

我有这个项目,在这个项目中我有这两个文件,第一个文件是表单文件,第二个文件是服务文件,我想访问服务文件中包含的答案,但是我有一个错误:

代码语言:javascript
复制
Uncaught TypeError: Object(...)(...).then is not a function

我该怎么解决呢?

这个文件包含一个表单,通过这个表单,我想调用getjobs函数。

代码语言:javascript
复制
import InputAdornment from "@material-ui/core/InputAdornment";
import TextField from "@material-ui/core/TextField";
import { useEffect, useState } from "react";
import { Controller, useFormContext } from "react-hook-form";
import { getJobs } from "../../store/salaryScalesSlice";
import { useDispatch, useSelector } from "react-redux";
import { Autocomplete } from "@material-ui/lab";

function ShippingTab(props) {
  const methods = useFormContext();
  const { control } = methods;
  const dispatch = useDispatch();

  useEffect(() => {
    dispatch(getJobs());
  }, [dispatch]);

  const [jobs, setJobs] = useState([]);

  useEffect(() => {
    getJobs().then((response) => setJobs(response));
  }, []);

  console.log("jobs: ", jobs);

  return (
    <div>
      <div className="flex -mx-4">
        <Controller
          name="job"
          control={control}
          defaultValue={[]}
          render={({ field: { onChange, value } }) => (
            <Autocomplete
              disablePortal
              id="combo-box-demo"
              style={{ width: 900 }}
              className="mt-8 mb-16"
              options={jobs || []}
              getOptionLabel={(option) => option.name || ""}
              value={value}
              onChange={(event, newValue) => {
                onChange(newValue);
              }}
              renderInput={(params) => (
                <TextField
                  {...params}
                  placeholder="Select Job Name"
                  label="Job"
                  variant="outlined"
                  fullWidth
                  InputLabelProps={{
                    shrink: true,
                  }}
                />
              )}
            />
          )}
        />
        <Controller
          name="employeeLevel"
          control={control}
          defaultValue={[]}
          render={({ field: { onChange, value } }) => (
            <Autocomplete
              id="employeeLevel"
              style={{ width: 900 }}
              className="mt-8 mb-16 mx-4"
              options={employeeLevels || []}
              getOptionLabel={(option) => option.employeeLevel || ""}
              value={value}
              onChange={(event, newValue) => {
                onChange(newValue);
              }}
              renderInput={(params) => (
                <TextField
                  {...params}
                  placeholder="Select Employee Level"
                  label="Employee Level"
                  variant="outlined"
                  fullWidth
                  InputLabelProps={{
                    shrink: true,
                  }}
                />
              )}
            />
          )}
        />

        <Controller
          name="amount"
          control={control}
          render={({ field }) => (
            <TextField
              {...field}
              className="mt-8 mb-16"
              label="Amount"
              id="amount"
              variant="outlined"
              InputProps={{
                startAdornment: (
                  <InputAdornment position="start">$</InputAdornment>
                ),
              }}
              fullWidth
            />
          )}
        />
      </div>
    </div>
  );
}

export default ShippingTab;

const employeeLevels = [
  { employeeLevel: "senior" },
  { employeeLevel: "junior" },
  { employeeLevel: "mid_level" },
];

service.js:

代码语言:javascript
复制
export const getJobs = createAsyncThunk("jobsRequests/getJobs", async () => {
  const response = await axios.get("/jobs").then((res) => {
    const jobsRequestsData = res.data.data;
    console.log("jobsRequestsData: ", jobsRequestsData);
    return jobsRequestsData;
  });

  return response;
})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-14 13:08:32

您正在混合承诺和异步/等待以太,这将导致意外的行为,因此应该避免。

等待关键字返回不能调用.then()的响应

如果您想坚持使用异步/等待方法,请将getjobs函数更改为如下所示(没有测试,只是想给出一个想法)

代码语言:javascript
复制
const getJobs = async () => {
  const response = await axios.get("/jobs");
  return response.data.data;
}

否则,您可以删除异步/等待keyowrds并返回承诺。

第二个问题是createAsyncThunk。您得到的错误在useEffect钩子中。

如文件所述:

createAsyncThunk生成的块将始终返回一个已解决的承诺

您应该实现完整的redux流来设置道具。查看文档或删除它。

票数 0
EN

Stack Overflow用户

发布于 2022-04-14 13:07:51

您不需要返回两次,只需删除返回响应:

代码语言:javascript
复制
export const getJobs = createAsyncThunk("jobsRequests/getJobs", async () => {
  const response = await axios.get("/jobs").then((res) => {
    return res.data.data
  });

})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71871986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档