Ожидание users.forEach()
ничего не делает, потому что forEach
не имеет возвращаемого значения, поэтому ждать нечего. Вероятно, он выполняет итерацию по всему списку, а затем сразу же завершает работу, которая затем возвращается из main
и вызывает process.exit()
до того, как .save()
s получит возможность выполнить.
Однако вы можете сделать следующее: дождитесь всех обещаний до конца sh, используя Promise.all()
. Это потребует от вас отображения каждого пользовательского творения в Обещание, но в любом случае ваша функция User.save
выполняет возвращение Обещания. Вот пример того, как вы можете это сделать:
function save(user) {
// do something async here
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`${user.name} Saved!`);
resolve()
}, 1500);
});
}
const main = async () => {
const users = [
{ name: 'Benny', age: 28, status: 'active' },
{ name: 'Claire', age: 28, status: 'active' }
]
// map async processes into an array of promises
const newUsers = users.map(user => save(user));
// await the resolution of all promises, then proceeed
await Promise.all(newUsers);
console.log("Created users!")
}
const run = async () => {
await main()
console.log("done")
}
run()
Очевидным преимуществом этого является то, что вызовы базы данных будут выполняться параллельно, что значительно ускорит процесс заполнения. Концептуально, то, что вы пытались сделать, подождало бы, пока каждый вызов базы данных не завершится sh, прежде чем запускать следующий (он же работает поочередно). Если вам нужно, чтобы они выполнялись по порядку, то это хорошо, но, похоже, ваш сценарий использования этого не требует.