Promise.All условно ждут обещания

У меня есть список асинхронных функций, каждая из которых имеет такое условие, что функция должна вызываться тогда и только тогда, когда выполняется соответствующее условие, и я хочу запускать все функции параллельно. Пример:

await Promise.all([asyncFunc1(), asyncFunc2(), ...]) 

Каждая функция в списке должна вызываться тогда и только тогда, когда выполняются соответствующие условия: cond1, cond2, .... Как лучше всего это сделать?

Функции не будут работать параллельно.

Pointy 11.12.2020 14:34

Нет смысла не ждать функцию, которую вы вызываете. Вы имеете в виду, что на самом деле не хотите вызывать соответствующую функцию на основе условий?

Bergi 11.12.2020 14:42

@ Берги Да. Извините за это, я отредактирую вопрос

user7964141 11.12.2020 14:53

Хорошо, в таком случае вы нашли подходящее решение :-)

Bergi 11.12.2020 14:54

@Pointy Mabye Я неправильно понял этот ответ: stackoverflow.com/a/35612484/7964141 Есть ли способ запустить все асинхронные функции параллельно?

user7964141 11.12.2020 14:58

Запуск группы асинхронных операций может привести к параллельному выполнению вне контекста JavaScript, но это зависит от службы, в которую вовлечены операции. Что касается самого JavaScript, операции приведут к событиям, когда они завершатся успешно или неудачно, и эти события будут обрабатываться одно за другим по мере их возникновения.

Pointy 11.12.2020 14:59

@Pointy Это имеет большой смысл. Благодарю за разъяснение!

user7964141 11.12.2020 15:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
545
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я придумал это очень простое решение:

const promiseList = []
if (cond1) promiseList.push(asyncFun1())
if (cond2) promiseList.push(asyncFun2())
...
await Promise.all(promiseList)
Ответ принят как подходящий

Поместите свои условия в массив и отфильтруйте с его помощью список функций:

const conditions = [cond1, cond2, cond3, cond4]
const functions = [asyncFunc1, asyncFunc2, () => asyncFunc3(foo), bar.asyncFunc4.bind(bar, baz)]

await Promise.all(
  functions
    .filter((_, i) => conditions[i])
    .map(fn => fn())
)

Чтобы передать параметры вашим асинхронным функциям (или сохранить их this контекст), .bind их или обернуть их в другие функции.

Другие вопросы по теме