javascript - 在 Promise() 中使用 while 循环
问题描述
我有一个用户列表,我正在检查所有用户的某些详细信息。我正在使用带有 express 的 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.log('Level One Achieved By ', sponsor_id.id);
} else if (user_level === 2 && level_length.length === 9) {
console.log('Level Two Is Achieved By ', sponsor_id.id);
} else {
console.log('No Level');
}
await models.RoyaltyUser.findOne({where: {id: sponsor_id.sId}})
.then((sponsor_new_row) => {
sponsor_id = sponsor_new_row;
})
.catch((e) => {
console.log(' 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.log('done');
})
.catch((e) => {
console.log('Catch two', e.message);
})
});
解决方案
避免Promise
构造函数 antipattern,避免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.log('Level One Achieved By ', sponsor_id.id);
} else if (user_level === 2 && level_length.length === 9) {
console.log('Level Two Is Achieved By ', sponsor_id.id);
} else {
console.log('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.log('done');
}, e => {
console.log('Catch two', e.message);
});
});
推荐阅读
- python - 如何编写一个可用于 in 语句左侧的类?
- android - 将函数作为参数传递并执行自定义函数?
- wso2 - 将所有变量与调解器合二为一
- python - flask-restful - 当前请求的资源类
- c++ - 为什么在这个模板模板参数中参数推导不起作用
- node.js - 如何检测 Webchat/DirectLine 中的对话结束?
- wpf - 如何绑定元素跨窗口?
- mysql - Laravel - 使用 mysql Rand() 和 Seed 进行分页
- javascript - TypeScript:使用自定义验证值扩展键
- mongodb - MongoDB 聚合中的 new Date() 返回 1970-01-01T00:00:00Z