繁体   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