У меня есть список асинхронных функций, каждая из которых имеет такое условие, что функция должна вызываться тогда и только тогда, когда выполняется соответствующее условие, и я хочу запускать все функции параллельно. Пример:
await Promise.all([asyncFunc1(), asyncFunc2(), ...])
Каждая функция в списке должна вызываться тогда и только тогда, когда выполняются соответствующие условия: cond1
, cond2
, .... Как лучше всего это сделать?
Нет смысла не ждать функцию, которую вы вызываете. Вы имеете в виду, что на самом деле не хотите вызывать соответствующую функцию на основе условий?
@ Берги Да. Извините за это, я отредактирую вопрос
Хорошо, в таком случае вы нашли подходящее решение :-)
@Pointy Mabye Я неправильно понял этот ответ: stackoverflow.com/a/35612484/7964141 Есть ли способ запустить все асинхронные функции параллельно?
Запуск группы асинхронных операций может привести к параллельному выполнению вне контекста JavaScript, но это зависит от службы, в которую вовлечены операции. Что касается самого JavaScript, операции приведут к событиям, когда они завершатся успешно или неудачно, и эти события будут обрабатываться одно за другим по мере их возникновения.
@Pointy Это имеет большой смысл. Благодарю за разъяснение!
Я придумал это очень простое решение:
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
их или обернуть их в другие функции.
Функции не будут работать параллельно.