У меня есть список пользователей, и я проверяю всех пользователей с определенными деталями. Я использую 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);
})
});
Что именно не работает?
это работает так, как ожидалось. но я не уверен, что это не приведет к сбою в определенный момент. я новичок в выражении. Я просто хочу знать, что такое выполнение обещания является правильным или неправильным.
Цикл while, о котором вы спросили в заголовке вопроса, в порядке, остальное ужасно :-)
Можете ли вы сказать мне, как я могу удалить ужасные вещи? bcz это выходит за рамки моей компетенции
Большое спасибо, bergi.U потрясающие.
Рад, что помог :-) Возможно, вы захотите проголосовать за и / или принять ответ
@Bergi, мне нужна еще одна помощь. Пожалуйста, вы можете разобраться в этом.
Где? С чем?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Избегайте Конструктор 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);
});
});
Избегайте Конструктор
Promiseантипаттерн! И избегайте использованияthen, когда у вас естьasync/await!