Sobes.tech
Middle+

Защо при реализирането на promiseAll трябва да разчитаме на брояча count, а не просто да проверяваме дължината на масива с резултати?

sobes.tech AI

Отговор от AI

При реализиране на Promise.all не може просто да се проверява дължината на масива с резултатите, защото промисите могат да завършат във всякакъв ред, а някои от тях могат да се провалят по-рано от останалите.

Броячът count се увеличава само когато промисът успешно завърши, което позволява точно да се следи колко промиса вече са изпълнени. Ако проверявахме само дължината на масива с резултатите, можехме погрешно да предположим, че всички промиси са завършили, дори ако някои все още са в процес или е възникнала грешка.

Пример:

function promiseAll(promises) {
  return new Promise((resolve, reject) => {
    const results = [];
    let count = 0;

    promises.forEach((p, i) => {
      Promise.resolve(p)
        .then(value => {
          results[i] = value;
          count++;
          if (count === promises.length) {
            resolve(results);
          }
        })
        .catch(err => reject(err));
    });
  });
}

Тук, броячът гарантира, че ще изчакаме завършването на всички промиси, а не само наличието на елементи в масива results.