如何正确处理 Promises 中的 reject

How to properly handle reject in Promises

我们的代码中有这个函数用于登录用户

const userLogin = loginData => {
  return new Promise(async (resolve, reject) => {
    try {
      const res = await auth.post("/login", loginData);
      resolve(res);
    } catch (error) {
      reject(error);
    }
  });
};
// Calling function
const loginSubmit = async values => {
  try {
    const res = await userLogin(values);
    console.info(res);
  } catch (error) {
    console.error("Catch: ", error);
  }
};

但是从 开始,try-catch 块在 Promises 中是多余的。我想尝试清理这段代码,所以我将上面的代码更改为:

const userLogin = loginData => {
  return new Promise(async (resolve, reject) => {
    const res = await auth.post("/login", loginData);
    if (res.status !== 201) {
      reject(new Error("Error"));
    }
    resolve(res);
  });
};

但是,当我尝试使用不正确的凭据登录时,控制台会记录 Uncaught (in promise) Error: Request failed with status code 400

我不太熟悉创建自己的承诺,所以我不知道如何正确地做到这一点。

您的代码中有几个问题:

  • 你在创建一个没有必要的承诺; auth.post(..) 已经 returns 一个承诺,所以你不需要自己创建一个承诺并将 auth.post(...) 包装在一个承诺构造函数中。

  • 代码中的另一个问题是执行函数(传递给 promise 构造函数的函数)被标记为 async;它 .

您的函数可以重写为:

const userLogin = async (loginData) => {
    const res = await auth.post("/login", loginData);
    
    if (res.status !== 201) {
      throw new Error("Error"));
    }

    return res;
};

您也可以将函数重写为:

const userLogin = async (loginData) => {
    return auth.post("/login", loginData);       
};

不要忘记在调用此函数的代码中使用 catch

您可能需要阅读以下文章以了解您是否需要 try-catch 块:await vs return vs return await

我认为在你的情况下,因为你在 promise 的构造函数中调用异步函数,你需要使用 try catch。
只要您在构造函数中发生错误(即 Promise 对象正在制作中),您提到的答案就是正确的,但是在您的情况下, auth 函数的拒绝发生在 Promise 构造很久之后因此它没有拒绝它。

顺便说一句 - 您不必 await 承诺。您可以执行以下操作:

const userLogin = loginData => {
  return new Promise(async (resolve, reject) => {
    const prom = auth.post("/login", loginData)
      .then((res) => {
        if (res.status !== 201) {
          reject(new Error("Error"));
        }
        resolve(res);
      });
    resolve(prom);
  });
};

由于您 resolve 异步 auth 调用,auth 调用的任何拒绝都将反映为您函数的拒绝