.map()
не выполняет обещаний. Поэтому, когда вы передаете ему обратный вызов async
, как вы, он не обращает никакого внимания на это возвращенное обещание. Таким образом, он просто запускает l oop один за другим, не ожидая ни одного из возвращающихся обещаний. Таким образом, все асинхронные операции, запущенные в .map()
l oop, будут выполняться одновременно.
Если это то, что вы хотите, и вы хотите собрать все возвращенные обещания, чтобы вы могли позже Посмотрите, когда все они сделаны с Promise.all()
, тогда этот шаблон хорошо работает:
Promise.all(someArray.map(callbackThatReturnsAPromiseHere))
И это обычный шаблон дизайна для него. На самом деле, библиотека обещаний Bluebird имеет специальную функцию, объединяющую эти две функции, которая называется Promise.map()
. Он также предложил еще одну приятную функцию, которая позволяет вам контролировать, сколько одновременных асин c операций может выполняться одновременно (потому что это map()
операция с учетом обещаний).
Похоже, вы пытаетесь понять если вы должны использовать только .map()
и не использовать Promise.all()
. Если вы сделаете это, вы будете выполнять свои асинхронные операции параллельно, но у вас не будет представления о том, когда они все будут выполнены, или о возможности собрать все результаты. Вы должны использовать Promise.all()
в массиве возвращенных обещаний, чтобы знать, когда они все будут выполнены, и / или собирать их разрешенные результаты.
К вашему сведению, .map()
ПРОСТО - просто l oop. Он не имеет никаких специальных асинхронных функций или каких-либо специальных функций параллельного запуска. Вы можете сделать то же самое с for
l oop, если хотите. Он не приостанавливает ваш обратный вызов async
, чтобы дождаться его выполнения, поэтому побочным эффектом его запуска является запуск нескольких параллельных асинхронных операций.