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

Здесь count гарантирует, что мы дождёмся завершения всех промисов, а не просто наличия элементов в массиве results.