javascript 我不知道在哪里使用await

rn0zuynd  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(89)

不知道在verifyPassword之前是否要放置await...如果我在verifyPassword之前删除await,吐司不会关闭,程序会无限运行。

onSubmit函数:

onSubmit: async (values) => {
      let loginPromise = await verifyPassword({
        username: username,
        password: values.password,
      });

      toast.promise(loginPromise, {
        loading: "Checking...",
        success: <b> Login successfully...</b>,
        error: <b> Incorrect Password </b>,
      });

      loginPromise.then((res) => {
        let { token } = res.data;
        localStorage.setItem("token", token);
        navigate("/profile");
      });
    },

字符串

verifyPassword函数:

//login function
export async function verifyPassword({ username, password }) {
  try {
    if (username) {
      const { data } = await axios.post(`/api/login`, {
        username,
        password,
      });
      return Promise.resolve({ data });
    }
  } catch (error) {
    return Promise.reject({ error: "Incorrect password ..." });
  }
}


我已经在其他提交调用中应用了await,但它工作得很好。

async function onSubmit(e) {
    try {
      e.preventDefault();
      let { status } = await verifyOTP({ username, code: OTP });
      if (status === 201) {
        toast.success("Verified successfully");
        return navigate("/reset");
      }
    } catch (error) {
      return toast.error("Wrong OTP please try again!!!");
    }
  }

verifyOTP函数:

// verify OTP
export async function verifyOTP({ username, code }) {
  try {
    const { data, status } = await axios.get("/api/verifyOTP", {
      params: { username, code },
    });
    return { data, status };
  } catch (error) {
    return Promise.reject({ error });
  }
}


我把await放在第二行,吐司显示(检查......),不要走开。我是React的新手,所以我认为一旦verifyPassword resolve或reject promise,那么加载消息必须关闭,但它没有。但是如果我在verifyPassword之前删除await,那么应用程序就可以完全正常工作。现在我很困惑在哪里使用await。

gr8qqesn

gr8qqesn1#

await运算符不返回promise,所以loginPromise不是promise,而是数据对象。这意味着您没有将promise作为第一个参数传递给toast.promise,也意味着它没有.then方法。
为了解决这个问题,不要在这里使用await,而是真正获取verifyPromise返回的promise。然后,使用toast.promise返回传递给它的promise,await返回传递给它的promise以获取res对象。不需要更多的then调用来处理这些数据:

onSubmit: async (values) => {
      const loginPromise = verifyPassword({
        username: username,
        password: values.password,
      });

      const res = await toast.promise(loginPromise, {
        loading: "Checking...",
        success: <b> Login successfully...</b>,
        error: <b> Incorrect Password </b>,
      });

      const { token } = res.data;
      localStorage.setItem("token", token);
      navigate("/profile");
    },

字符串

相关问题