javascript promise在两个地方拒绝

时间:2018-12-24 09:02:41

标签: javascript asynchronous async-await

我使用基于承诺的库,例如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()
        }
    })
}

这种技术正确吗?我在两个地方都答应了我的诺言。

3 个答案:

答案 0 :(得分:1)

一些问题:

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

您为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):您需要改善这种情况。

答案 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-awaitpromise