javascript - javascript 承诺在两个地方拒绝
问题描述
我使用基于 Promise 的库,例如moment.js
和axios
. 这次我想自己创造一个承诺。
我有发送电子邮件的功能。我想要的只是如果没有错误解决承诺,如果有错误拒绝承诺。
export default async function password_reset_request(email, user_name, link) {
return new Promise((resolve, reject) => {
try {
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'something@gmail.com',
pass: 'secret'
}
});
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
reject()
} else {
resolve()
}
});
} catch (error) {
reject()
}
})
}
这种技术正确吗?我在两个地方因为我的承诺而被拒绝。
解决方案
几个问题:
- 不使用时不需要
async
函数await
。您的函数已经返回了一个承诺,因此不需要async
. - 在 promise 构造函数回调函数中不需要有一个
try...catch
块:如果在那里发生异常,它将自动转换为以错误为原因的拒绝。注意:同样的原则也适用于then
回调。
你所做的承诺sendMail
是正确的。最好的做法是单独为它创建一个专用函数(所以没有createTransport
)。将有用的信息传递给reject
and也很好resolve
:
function sendMailPromise(transporter, mailOptions) {
return new Promise((resolve, reject) => {
transporter.sendMail(mailOptions, function (error, info) {
return error ? reject(error) : resolve(info);
});
})
}
export default function password_reset_request(email, user_name, link) {
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'something@gmail.com',
pass: 'secret'
}
});
return sendMailPromise(transporter, mailOptions);
}
有一些未使用的变量 ( email
, user_name
, link
) 和似乎是全局变量 ( mailOptions
):您需要改善这种情况。
推荐阅读
- c# - 如何重构代码以将 HTTP 触发器转换为 Blob 触发器?
- codenameone - 代号一中的滑动/手势
- postgresql - 使用 Go 从一个 postgres 数据库复制到另一个
- flutter - 在 Flutter 中关闭键盘后如何将 Firebase Admob 定位在底部?
- python - 如何在关键字之前获取数字?
- javascript - JavaScript 数据工具
- r - summary.formula 中的错误:矩阵变量必须有列暗名
- javascript - React textarea 意外失去焦点
- node.js - 如何计算数组 mongo db 查询中错误值的数量
- sql - 我有一个仓库中的周期盘点信息,该仓库多次计算相同的位置。我想获取特定位置的最新 NET_VAR