Promise.all
предназначен для сохранения порядка результатов обещаний, которые были ему переданы, независимо от порядка, в котором эти обещания фактически были выполнены.Поэтому, когда Promise.all
разрешается, это означает, что все отдельные обещания разрешены, а затем Promise.all
разрешается в массив разрешений в том же порядке , что и соответствующие обещания в массиве.
Однако, если вы выведите значения , как только их обещания разрешат , то вышеизложенное, конечно, не повлияет на ваш вывод - теперь оно будет упорядочено в порядке, в котором разрешаются отдельные обещания.
Простой пример:
Допустим, есть три обещания p1
, p2
, p3
, которые разрешаются в 1, 2 и 3. Но второе обещание разрешится раньше, чемдва других.
Promise.all
вызывается с [p1, p2, p3]
.Он возвращает новое обещание, которое в конечном итоге разрешится на [1, 2, 3]
.В то время, когда не все обещания разрешены, вы можете представить, что внутренний массив развивается следующим образом:
p2
разрешается.Promise.all
внутренне хранит [undefined, 2, undefined]
p1
разрешает.Promise.all
внутренне хранит [1, 2, undefined]
p3
разрешает.Promise.all
также разрешается со значением [1, 2, 3]
Здесь вы можете видеть, что первый код будет выводить 2, 1, 3, а второй - 1, 2, 3