обещание javascript отклоняется в двух местах - PullRequest
0 голосов
/ 24 декабря 2018

Я работаю с основанными на обещаниях библиотеками, такими как moment.js и axios.На этот раз я хочу создать обещание самостоятельно.

У меня есть функция для отправки электронных писем.Просто то, что я хочу, это если нет ошибки, разрешите обещание и если есть ошибка, отклоните обещание.

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 голосов
/ 24 декабря 2018

Можем ли мы использовать функцию разрешения или отклонения в более чем одном месте?

Да, мы можем, нет проблем.Это похоже на возврат разных вещей в разных условиях.

Правильно ли вы использовали обещания?

Нет.Почему вы используете асинхронную функцию и обещание одновременно?Какая польза от создания функции async?

Просто измените код на это.

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 предоставляет несколько функций для одной и той же функциональности, нам нужно решить, какая из них лучше всего подходит для нашего случая, вместо того, чтобы использовать все сразу.

Просмотрите эти документы async-await , обещание в Javascript.

0 голосов
/ 24 декабря 2018

Несколько проблем:

  • Вам не нужна функция async, когда вы не используете await.Ваша функция уже возвращает обещание, поэтому нет необходимости в async.
  • . Нет необходимости иметь блок try...catch внутри функции обратного вызова конструктора обещаний: если возникает исключение, оно автоматически будетпреобразуется в отклонение с ошибкой в ​​качестве причины.NB: Тот же принцип действует в обратном вызове then.

обещание , которое вы сделали для sendMail, является правильным.Лучше всего было бы создать для этого отдельную функцию (без createTransport).Также было бы хорошо передать полезную информацию reject и 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): вам нужно улучшить эту ситуацию.

0 голосов
/ 24 декабря 2018

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

Пожалуйста, проверьте это исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...