首页 > 解决方案 > javascript 承诺在两个地方拒绝

问题描述

我使用基于 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()
        }
    })
}

这种技术正确吗?我在两个地方因为我的承诺而被拒绝。

标签: javascriptasynchronousasync-await

解决方案


几个问题:

  • 不使用时不需要async函数await。您的函数已经返回了一个承诺,因此不需要async.
  • 在 promise 构造函数回调函数中不需要有一个try...catch块:如果在那里发生异常,它将自动转换为以错误为原因的拒绝。注意:同样的原则也适用于then回调。

你所做的承诺sendMail是正确的。最好的做法是单独为它创建一个专用函数(所以没有createTransport)。将有用的信息传递给rejectand也很好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):您需要改善这种情况。


推荐阅读