带有 async/await 的 Promise

Fra*_*ETH 0 javascript node.js async-await

我想知道这个承诺是否可以。因为我正在使用await它们内部。

示例1:

new Promise(async (resolve, reject) => {
    await fetch(url, postReq)
      .then((data) => {
        return data.json();
      })
      .then((res) => {
        console.log(res);
        resolve("Message sent successfully");
      })
      .catch((error) => {
        console.log(error);
        reject(error);
      });
  });
Run Code Online (Sandbox Code Playgroud)

示例2:

  const sendEmail = async (reciever, data) => {
      new Promise(async (resolve, reject) => {
        console.log("Sending Email");
        try {
          // create reusable transporter object using the default SMTP transport
          let transporter = nodemailer.createTransport({
            service: "gmail",
            auth: {
              user: process.env.EMAIL_ADDRESS,
              pass: process.env.EMAIL_PASSWORD,
            },
          });

      // send mail with defined transport object
      let info = await  transporter.sendMail({
        from: '', // sender address
        to: `${reciever}`, // list of receivers
        subject: "", // Subject line
        text: ``, // plain text body
        html: ``, // html body
      });

      console.log("Message sent: %s", info.messageId);
      resolve("Email Sent")
    } catch (err) {
      console.log(err);
      reject(err);
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

如果我不使用await,我将无法读取,info.messageId因为它未定义。

jfr*_*d00 5

这些示例都不是正确的处理方式:

  • 不要将现有的承诺包装在手动创建的承诺中。这样做被命名为Promise 构造函数反模式
  • 不要混合 .then()await。这样做会使控制流、可读性以及正确的错误处理变得复杂。您通常应该为给定的函数选择一种控制流模型或另一种。
  • 您不需要捕获并重新抛出自己的错误,除非您要在捕获中执行某些操作(例如更改错误或运行一些逻辑或记录错误)。在许多情况下,承诺拒绝只会传播回调用者。来电者有责任发现任何拒绝情况并进行适当处理。
  • 在新的 Promise 执行器回调中,不要创建它async,也不要await在其中使用它。如果您想这样做,那么说明其他问题是错误的,并且您可能根本不需要new Promise()这里的情况(因为您显然已经有了不应重新包装的承诺)。

示例1可以是这样的:

const response = await fetch(url, postReq);
const data = await response.json();
return data;
Run Code Online (Sandbox Code Playgroud)

甚至只是这样:

const response = await fetch(url, postReq);
return response.json();
Run Code Online (Sandbox Code Playgroud)

示例2可以是这样的:

const sendEmail = async (reciever, data) => {
  console.log("Sending Email");
  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: process.env.EMAIL_ADDRESS,
      pass: process.env.EMAIL_PASSWORD,
    },
  });

  // send mail with defined transport object
  const info = await transporter.sendMail({
    from: '', // sender address
    to: `${reciever}`, // list of receivers
    subject: "", // Subject line
    text: ``, // plain text body
    html: ``, // html body
  });

  console.log("Message sent: %s", info.messageId);
  return info;
};
Run Code Online (Sandbox Code Playgroud)