简体   繁体   English

javascript promise在两个地方拒绝

[英]javascript promise rejects in two places

I work with promise-based libraries such as moment.js and axios . 我使用基于promise的库,例如moment.jsaxios This time I want to create a promise by myself. 这次我想自己创造一个诺言。

I have a function to send emails. 我有发送电子邮件的功能。 Simply what I want is if there is no error resolve the promise and if there is an error reject the promise. 我想要的只是,如果没有错误,请兑现承诺;如果有错误,请拒绝承诺。

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

Is this technique correct? 这种技术正确吗? I am rejected for my promise in two places. 我在两个地方因诺言而被拒绝。

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

Please check this correction. 请检查此更正。

A few issues: 一些问题:

  • You don't need an async function when you don't use await . 不使用await时,不需要async函数。 Your function returns a promise already, so there is no need for async . 您的函数已经返回了Promise,因此不需要async
  • There is no need to have a try...catch block inside a promise constructor callback function: if an exception occurs there it will automatically be converted to a rejection with the error as reason. 在promise构造函数的回调函数中不需要try...catch块:如果发生异常,则它将自动转换为拒绝,并以错误为原因。 NB: The same principle holds in a then callback. 注意:相同的原则适用于then回调。

The promisifying you did for sendMail is correct. 你做的promisifying sendMail是正确的。 It would be best practice to create a dedicated function for that alone (so without createTransport ). 最好的做法是单独为此创建一个专用函数(因此不带createTransport )。 It would also be good to pass useful information to reject and resolve : 传递有用的信息来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);
}

There are some unused variables ( email , user_name , link ) and variables which seem to be global ( mailOptions ): you would need to improve that situation. 有一些未使用的变量( emailuser_namelink )和似乎是全局变量( mailOptions ):您需要改善这种情况。

Can we use resolve or reject function in more then one place? 我们可以在一个以上的地方使用“解决”或“拒绝”功能吗?

Yes, we can there's no issue. 是的,我们可以没有问题。 It's similar to return different things under different conditions. 类似于在不同条件下返回不同的事物。

Have you used promises correctly? 您是否正确使用了诺言?

No. Why you are using async function and promise at same time? 否。为什么同时使用异步功能和Promise? What's use of creating function async? 创建函数异步有什么用?

Just modify code to this. 只需为此修改代码。

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

Will suggest you to read docs for any feature of JavaScript you want to use. 建议您阅读要使用的JavaScript的任何功能的文档。 JavaScript provide multiple functions for same functionality, we need to decide which works best for our case, in place of using all at once. JavaScript为相同的功能提供了多种功能,我们需要确定哪种方式最适合我们的情况,而不是一次全部使用。

Do go through these docs async-await , promise in Javascript. 不要去通过这些文档异步等待承诺在Javascript。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM