Обидва методи працюють із масивом промісів: вони запускають їх паралельно та очікують на їх завершення. Проте ці методи поводяться по-різному, тому і на співбесідах, і в реальній роботі важливо розуміти різницю між ними та знати, у яких ситуаціях який метод доречніший.
Promise.all
Цей метод приймає масив промісів і повертає масив з результатами в тому ж порядку, в якому ми передали проміси. Якщо всі вони завершилися успішно, то Promise.all завершується успіхом (fulfilled), але якщо хоча б один був відхилений (rejected), Promise.all відразу завершується з помилкою і не очікує проміси, яка в процесі виконання (pending).
Promise.allSettled
Теж запускає масив промісів паралельно, але очікує доки всі завершаться fulfilled/rejected, після чого повертає масив обʼєктів з даними або причиною помилки. Як можна побачити з відповіді від API, Promise.allSettled завершився успішно, навіть маючи rejected проміс. Це і є різниця між Promise.all і Promise.allSettled.
Коли і що використовувати
Promise.all найкраще використовувати для ідемпотентних операцій. Так як у випадку rejected ми без всяких проблем зможемо зробити Retry і перезапустити всі проміси. Найчастіше це отримання або оновлення даних. Якщо ви не знаєте, що таке ідемпотентність, то рекомендую почитати тут, так як це теж запитання на Node.js інтервʼю.
Promise.allSettled найкраще використовувати при створенні сутностей. Так як стан системи змінюється, ми не можемо зробити простий Retry для всіх промісів. А за допомогою allSettled ми зможемо вибрати проміси, які завершилися rejected, і перезапустити їх окремо.
Простим прикладом використання allSettled є завантаження багатьох картинок в галерею. Наприклад, ви завантажуєте одночасно 10 фотографій, і 7 з них завантажилися успішно, а три - з помилкою. Тоді ми можемо показати користувачу, що є проблеми з трьома картинками, і він зможе або видалити їх, або спробувати завантажити знову.