Первое, на что следует обратить внимание, это использование обратных вызовов в методе async
вместо await
с обещанием.Вам следует использовать обещание с версией Shops.find()
и await
результатов.
async function prepareAndUpdateUser(user) {
try {
const shops = await Shop.find({ _id: { $in: user.account.shops } }).exec();
return client.users.create({
email: user.email,
user_id: user._id,
companies: shops.map(shop => {
return {
company_id: shop._id,
name: shop.name[shop.defaultLanguage.code]
};
})
});
} catch (e) {
return Boom.boomify(err);
}
}
В вашем методе updateUsers
вы используете ограничитель скорости в обратном направлении.Вы хотите отобразить пользователей в ограничитель скорости, чтобы он мог контролировать, когда вызывается prepareAndUpdateUser
, в настоящее время вы будете запрашивать все параллельно.Вы также хотите дождаться разрешения, возвращаемого ограничителем скорости.По сути, вы захотите переместить limiter.scehdule(...)
в user.map(...)
.
async function updateUsers(query) {
try {
const users = await User.find(query)
.populate("account")
.limit(700);
if (users && users.length > 0) {
// Schedule an update for each user
const allTasks = users.map(user => {
// Schedule returns a promise that resolves when the operation is complete
return limiter.schedule(() => {
// This method is called when the scheduler is ready for it
return prepareAndUpdateUser(user)
})
});
// Wait for all the scheduled tasks to complete
await Promise.all(allTasks);
return users.length;
} else {
return 0;
}
} catch (err) {
return Boom.boomify(err);
}
}