Вы спрашивали об ожидании в циклах, но в вашем примере показан конкретный вид цикла, вызывая map
, поэтому ожидайте в карте
Pro:
- Много запросов начинаетсявозможно, все параллельно, скорее всего, гораздо быстрее, в зависимости от того, что
Product.CreateProductIfDoesntExists
делает
Con:
- Потенциально использует слишком много памяти в зависимости от количества продуктов и того, чтовид работы
Product.CreateProductIfDoesntExists
делает
Вот простой пример: в этом случае 5 вещей означает, что 80 мегабайт используется одновременно, но заканчивается через 2 секунды
const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function processThing() {
const data = new Uint8Array(1024 * 1024 * 16);
await wait(2000);
return data[data.length - 1]; // pretend we use data
}
async function main() {
const things = ['a', 'b', 'c', 'd', 'e'];
await Promise.all(things.map(async(thing) => {
await processThing(thing);
}));
console.log('--done--');
}
main();
против этого, используется только 16 мегабайт, но это занимает 10 секунд
const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));
async function processThing() {
const data = new Uint8Array(1024 * 1024 * 16);
await wait(2000);
return data[data.length - 1]; // pretend we use data
}
async function main() {
const things = ['a', 'b', 'c', 'd', 'e'];
for (const thing of things) {
await processThing(thing);
}
console.log('--done--');
}
main();
Если в первом примере, использующем map
, использовалось больше памяти на одну вещь или приходилось обрабатывать 1000 вещей или 10000 вещей, которые вы могли бы легко исчерпать из памяти.
Второй пример не исчерпает память, поскольку он обрабатывает только одну вещь за один раз.
Нет ничего плохого в использовании await на карте, если вы заранее не знаете, что произойдет. изнутри занимает тонны памяти, иначе количество обрабатываемых элементов будет очень большим.
Второй пример, вероятно, не идеален. Если вы действительно хотите обрабатывать 1000 или 10000 вещей, вы все равно, вероятно, захотите обрабатывать их по нескольку за раз (скажем, 10 за раз), и поэтому вам потребуется гораздо более сложная очередь работы, чтобы сделать это эффективным.