簡體   English   中英

javascript promise在兩個地方拒絕

[英]javascript promise rejects in two places

我使用基於promise的庫,例如moment.jsaxios 這次我想自己創造一個諾言。

我有發送電子郵件的功能。 我想要的只是,如果沒有錯誤,請兌現承諾;如果有錯誤,請拒絕承諾。

 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
  • 在promise構造函數的回調函數中不需要try...catch塊:如果發生異常,則它將自動轉換為拒絕,並以錯誤為原因。 注意:相同的原則適用於then回調。

你做的promisifying sendMail是正確的。 最好的做法是單獨為此創建一個專用函數(因此不帶createTransport )。 傳遞有用的信息來rejectresolve也將是一件好事:

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);
}

有一些未使用的變量( emailuser_namelink )和似乎是全局變量( 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為相同的功能提供了多種功能,我們需要確定哪種方式最適合我們的情況,而不是一次全部使用。

不要去通過這些文檔異步等待承諾在Javascript。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM