deep mann
deep mann

Reputation: 25

Using while loop in Promise()

I have a user list and i am checking all user with certain details.I am using sequelize js with express.I want to know that can we use while loop like this for searching and saving data in database.Please help me.Thanks In advance.

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

Upvotes: 1

Views: 77

Answers (1)

Bergi
Bergi

Reputation: 664610

Avoid the Promise constructor antipattern, avoid return await, and don't mix .then callbacks with async/await syntax. You can simplify a lot:

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

Upvotes: 1

Related Questions