Использование цикла while в Promise ()

У меня есть список пользователей, и я проверяю всех пользователей с определенными деталями. Я использую sequelize js с экспрессом. Я хочу знать, что мы можем использовать цикл while, подобный этому, для поиска и сохранения данных в базе данных. Пожалуйста, помогите мне. Заранее спасибо .

let royalty_bonus = async (sponsor) => {
    return await new Promise((resolve, reject) => {
        models.RoyaltyUser.findById(sponsor)
            .then(async (sponsorRow) => {
                let user_level = 1;
                let sponsor_id = sponsorRow;

                try {
                    while (sponsor_id != null && user_level <= 3) {
                        let level_length = await getLevel(sponsor_id.id, user_level);
                        if (user_level === 1 && level_length.length === 3) {
                            console.info('Level One Achieved By ', sponsor_id.id);
                        } else if (user_level === 2 && level_length.length === 9) {
                            console.info('Level Two Is Achieved By ', sponsor_id.id);
                        } else {
                            console.info('No Level');
                        }

                        await models.RoyaltyUser.findOne({where: {id: sponsor_id.sId}})
                            .then((sponsor_new_row) => {
                                sponsor_id = sponsor_new_row;
                            })
                            .catch((e) => {
                                console.info(' Inner Catch Error ', e.message);
                                reject();
                            });
                        user_level++;
                    }
                    resolve();
                }
                catch (e) {
                    reject(e);
                }

            })
            .catch((e) => {
                reject('catch ', e.message);
            });
    });

};
router.get('/royalty_user', async (req, res, next) => {
    royalty_bonus(4)
        .then(() => {
            console.info('done');
        })
        .catch((e) => {
            console.info('Catch two', e.message);
        })
});

Избегайте Конструктор Promise антипаттерн! И избегайте использования then, когда у вас есть async / await!

Bergi 08.09.2018 10:22

Что именно не работает?

Bergi 08.09.2018 10:24

это работает так, как ожидалось. но я не уверен, что это не приведет к сбою в определенный момент. я новичок в выражении. Я просто хочу знать, что такое выполнение обещания является правильным или неправильным.

deep mann 08.09.2018 10:33

Цикл while, о котором вы спросили в заголовке вопроса, в порядке, остальное ужасно :-)

Bergi 08.09.2018 10:34

Можете ли вы сказать мне, как я могу удалить ужасные вещи? bcz это выходит за рамки моей компетенции

deep mann 08.09.2018 10:45

Большое спасибо, bergi.U потрясающие.

deep mann 08.09.2018 17:02

Рад, что помог :-) Возможно, вы захотите проголосовать за и / или принять ответ

Bergi 08.09.2018 17:56

@Bergi, мне нужна еще одна помощь. Пожалуйста, вы можете разобраться в этом.

deep mann 09.09.2018 15:14

Где? С чем?

Bergi 10.09.2018 13:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Избегайте Конструктор Promise антипаттерн, избегайте return await и не смешивайте обратные вызовы .then с синтаксисом async / await. Вы можете многое упростить:

async function royalty_bonus(sponsor) {
    const sponsorRow = await models.RoyaltyUser.findById(sponsor);
    let user_level = 1;
    let sponsor_id = sponsorRow;

    while (sponsor_id != null && user_level <= 3) {
        let level_length = await getLevel(sponsor_id.id, user_level);
        if (user_level === 1 && level_length.length === 3) {
            console.info('Level One Achieved By ', sponsor_id.id);
        } else if (user_level === 2 && level_length.length === 9) {
            console.info('Level Two Is Achieved By ', sponsor_id.id);
        } else {
            console.info('No Level');
        }

        const sponsor_new_row = await models.RoyaltyUser.findOne({where: {id: sponsor_id.sId}});
        sponsor_id = sponsor_new_row;
        user_level++;
    }    
}

router.get('/royalty_user', (req, res, next) => {
    royalty_bonus(4).then(() => {
        console.info('done');
    }, e => {
        console.info('Catch two', e.message);
    });
});

Другие вопросы по теме