Как pu sh asyn c функции в массив без выполнения для будущего Promise.all - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть некоторые функции asyn c, которые выполняют вызовы REST API и возвращают результат. Я хочу использовать Promise.all для вызова нескольких из этих функций одновременно и ожидать полного результата. Я понимаю, как работает Promise.all, и это не проблема с Promise.all. Это проблема с использованием Array.pu sh для динамического создания массива асин c функций, которые я хочу вызвать.

Итак, вот сценарий. Пользователь моего приложения загружает страницу. Эта страница должна получить данные из API. Для этого используются те функции asyn c, о которых я упоминал. Однако данные, которые должна получить страница, отличаются в зависимости от установленных параметров. Поэтому иногда может потребоваться получить список пользователей, определенного клиента c и определенного проекта c. В других случаях может потребоваться получить всех пользователей и все проекты, а не клиентов.

Так что мой код выглядит примерно так:

created() {
  let promiseList = []
  if (options.getCustomers) { promiseList.push(listCustomers())
  if (options.getCustomer) { promiseList.push(getCustomer(customerId)) }
  if (options.getUsers) { promiseList.push(getUsers()) }
  await Promise.all(promiseList)
}

Так что это работает в некоторой степени. Promise.all работает просто отлично. Проблема в том, что я не могу поместить функцию sh в массив без немедленного ее вызова. Таким образом, каждая функция, которую я помещаю в массив обещание, вызывается дважды: немедленно и снова с Promise.all.

Как я могу передать sh функцию asyn c в массив как ссылка, чтобы она не выполнялась сразу?

1 Ответ

3 голосов
/ 20 февраля 2020

Поместите в массив ссылку на функцию и затем вызовите ее с картой при использовании Promise.all

created() {
  let promiseList = []
  if (options.getCustomers) { promiseList.push({ func: listCustomers })
  if (options.getCustomer) { promiseList.push({ func: getCustomer, arg: customerId}) }
  if (options.getUsers) { promiseList.push({ func: getUsers }) }
  await Promise.all(promiseList.map( (prom) => prom.func(prom.arg) ))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...