[英]javascript promise rejects in two places
我使用基于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() } }) }
这种技术正确吗? 我在两个地方因诺言而被拒绝。
export default async function password_reset_request(email, user_name, link) { return new Promise((resolve, reject) => { try { var transporter = await 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(); } }); }
请检查此更正。
一些问题:
await
时,不需要async
函数。 您的函数已经返回了Promise,因此不需要async
。 try...catch
块:如果发生异常,则它将自动转换为拒绝,并以错误为原因。 注意:相同的原则适用于then
回调。 你做的promisifying sendMail
是正确的。 最好的做法是单独为此创建一个专用函数(因此不带createTransport
)。 传递有用的信息来reject
和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
):您需要改善这种情况。
我们可以在一个以上的地方使用“解决”或“拒绝”功能吗?
是的,我们可以没有问题。 类似于在不同条件下返回不同的事物。
您是否正确使用了诺言?
否。为什么同时使用异步功能和Promise? 创建函数异步有什么用?
只需为此修改代码。
export default function password_reset_request(email, user_name, link) {
return new Promise((resolve, reject) => {
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'something@gmail.com',
pass: 'secret'
}
});
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
reject()
} else {
resolve()
}
});
})
}
建议您阅读要使用的JavaScript的任何功能的文档。 JavaScript为相同的功能提供了多种功能,我们需要确定哪种方式最适合我们的情况,而不是一次全部使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.