Por que .catch () não captura rejeitar () no construtor Promise dentro do loop em uma função assíncrona, a menos que Erro seja passado?

Dado

(async () => {
 const p = await new Promise((resolve, reject) => setTimeout(() => {
    reject(new Error(1))
  }, Math.floor(Math.random() * 1000))); return p})()
.then(data => console.log(data))
.catch(err => console.error(err));

aError() está logado em.catch()

Se estendermos o padrão para usar um loop, oError está logado em.catch()

const fn = async(res, ...props) => {
  for (let prop of props) res.push(await prop())
  return res
}

const arr = [
  () =>
    new Promise((resolve, reject) => 
      setTimeout(() =>
        reject(new Error(1))
      , Math.floor(Math.random() * 1000))
    ),
  () => 
    new Promise((resolve, reject) => 
      setTimeout(() => 
        resolve(1) 
      , Math.floor(Math.random() * 1000))
    )
  ];

fn([], ...arr)
.then(data => console.log(data))
.catch(err => console.log(err));

Se usarmos um loop para chamar mais de uma função que retorna umPromise e não passa explicitamenteError() parareject() doPromise construtorresolver função.catch() não pega o erro e o arrayres não é retornado, apenas oPromise valor passado pararesolve() está disponível em

const fn = async(res, ...props) => {
  for (let prop of props) res.push(await prop())
  return res
}

const arr = [
  () =>
    new Promise((resolve, reject) => 
      setTimeout(() =>
        reject(1)
      , Math.floor(Math.random() * 1000))
    ),
  () => 
    new Promise((resolve, reject) => 
      setTimeout(() => 
        resolve(1) 
      , Math.floor(Math.random() * 1000))
    )
  ];

fn([], ...arr)
// what happened to our array `res` returned from `fn`?
.then(data => console.log(data))
// what happened to our rejected Promise?
.catch(err => console.log(err)); 

Questões:

Porquereject() a chamada não se propaga para.catch() quandoError() não é explicitamente passado parareject() dentroPromise construtor dentro de um loop em umasync função?

Por que apenas um únicoPromise valor retornado para.then() embora uma matriz seja retornada doasync funcionar quando um dosPromise objetos iterados em um loopreject() função é chamada dentroPromise construtorresolver função?

questionAnswers(2)

yourAnswerToTheQuestion