我使用基于承诺的库,例如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()
}
})
}
这种技术正确吗?我在两个地方都答应了我的诺言。
答案 0 :(得分:1)
一些问题:
async
时不需要await
函数。您的函数已经返回了一个Promise,因此不需要async
。try...catch
块:如果发生异常,它将自动转换为拒绝,并以错误为原因。注意:then
回调中也有同样的原理。您为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
):您需要改善这种情况。
答案 1 :(得分:0)
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();
}
});
}
请检查此更正。
答案 2 :(得分:0)
我们可以在一个以上的位置使用“解析”或“拒绝”功能吗?
是的,我们可以没有问题。类似于在不同条件下返回不同的东西。
您正确使用了诺言吗?
不。为什么要同时使用异步功能和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为相同的功能提供了多种功能,我们需要确定哪种方式最适合我们的情况,而不是一次全部使用。
请仔细阅读Javascript中的这些文档async-await,promise。