咨询在Promise内部使用await的写法是否合规
关于内部使用await的Promise写法合理性分析
示例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); }); });
问题点:
- 没必要给Promise executor加async:executor本身同步执行,加async会让它返回Promise,但Promise构造器不会处理这个返回值,完全多余。
- 混用await和then/catch冗余:既然用了await,就该搭配try/catch处理异步逻辑,混用会让代码结构混乱,可读性下降。
- 错误处理有隐患:async executor的异常会被包装成Promise rejection,虽然这里catch处理了fetch的错误,但写法完全没必要绕弯。
优化后的写法:
const sendRequest = async () => { try { const data = await fetch(url, postReq); const res = await data.json(); console.log(res); return "Message sent successfully"; } catch (error) { console.log(error); throw error; } };
直接用async函数替代手动new Promise,逻辑清晰,错误处理统一。
示例2:存在返回值丢失与冗余包装的问题
原代码:
const sendEmail = async (reciever, data) => { new Promise(async (resolve, reject) => { console.log("Sending Email"); try { let transporter = nodemailer.createTransport({ service: "gmail", auth: { user: process.env.EMAIL_ADDRESS, pass: process.env.EMAIL_PASSWORD, }, }); let info = await transporter.sendMail({ from: '', to: `${reciever}`, subject: "", text: ``, html: ``, }); console.log("Message sent: %s", info.messageId); resolve("Email Sent") } catch (err) { console.log(err); reject(err); } }); };
问题点:
- sendEmail未返回内部Promise:内部new Promise后没有return,导致调用
sendEmail()时拿到的是resolved为undefined的Promise,无法获取返回值或捕获错误。 - 冗余包装Promise:sendEmail本身已是async函数,内部可直接写异步逻辑,不需要再套一层new Promise,属于典型的Promise嵌套反模式。
- executor加async无意义:和示例1同理,Promise构造器的executor不需要是async函数。
你提到"不使用await无法读取info.messageId"是对的——transporter.sendMail()返回Promise,不加await的话info是Promise对象,而非resolved后的结果,自然拿不到messageId属性。
优化后的写法:
const sendEmail = async (reciever, data) => { console.log("Sending Email"); try { const transporter = nodemailer.createTransport({ service: "gmail", auth: { user: process.env.EMAIL_ADDRESS, pass: process.env.EMAIL_PASSWORD, }, }); const info = await transporter.sendMail({ from: '', to: `${reciever}`, subject: "", text: ``, html: ``, }); console.log("Message sent: %s", info.messageId); return "Email Sent"; } catch (err) { console.log(err); throw err; } };
去掉多余的Promise包装,直接在async函数内用try/catch处理逻辑,同时确保返回值和错误能被外部捕获。
内容的提问来源于stack exchange,提问作者Fran ETH
相关产品推荐
相关产品推荐

