Я вижу, что это ответ, но я думаю, что могу уточнить немного больше.
Пожалуйста, помните, что каждый then()
или catch()
возвращает Promise
. (Если у вас нет явного return
в обратном вызове, оба вернут Promise.resolve(undefined)
). Поэтому после того, как обещание выполнено, значением всей цепочки обещаний будет обещание, возвращаемое последним then()
;
Пример:
promise = Promise.resolve(1)
.then(() => Promise.resolve(2))
.then(() => Promise.resolve(3));
console.log(promise);
setTimeout(() => {
console.log(promise)//Promise {<resolved>: 3}
}, 0)
catch()
работает точно так же, как then()
. Разница лишь в том, что он вызывается на rejected
обещаниях, а не resolved
.
В следующем примере я просто заменяю все resolve
на reject
, чтобы продемонстрировать это.
promise = Promise.reject(1)
.catch(() => Promise.reject(2))
.catch(() => Promise.reject(3));
console.log(promise);
setTimeout(() => {
console.log(promise)//Promise {<rejectd>: 3}
}, 0)
Теперь перейдем к вашему вопросу. Значение Promise.all()
является отклоненным обещанием, поскольку одно из обещаний в массиве отклонено. Если у вас есть блок catch в цепочке, управление перейдет к тому блоку catch
, который вернет Promise.resolve(undefined)
. Если у вас нет цепочки уловов в цепочке, вы получите то, что у вас есть: отклоненное обещание.