[英]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.