Как передать массив обещаний, не вызывая их? - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь передать массив топоров ios (как обещание) в функцию. и когда я вызываю метод, мне нужно выполнить эти обещания.

const arrayOfAxios = [
  axios('https://api.github.com/')
]

setTimeout(() => {
  console.log('before call promise');

  Promise.all(arrayOfAxios).then(res => {

   console.log({ res });
  });

}, 5000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.19.2/axios.js" integrity="sha256-bd8XIKzrtyJ1O5Sh3Xp3GiuMIzWC42ZekvrMMD4GxRg=" crossorigin="anonymous"></script>

В моем коде я сразу вижу это https://api.github.com/. а не когда я призываю promise.all.

Я сделал это неправильно? Есть ли другой способ установить массив обещаний и вызвать их позже? (Я имею ввиду для топора ios пример)

1 Ответ

3 голосов
/ 13 марта 2020

Обещания не запускают ничего, они просто наблюдают за работающими вещами. Так что дело не в том, что вы не хотите ссылаться на обещания, а в том, что вы не хотите начинать то, что они соблюдают. Когда вы вызываете axios (или что-то еще), уже уже начал процесс, который возвращает обещание, которое он возвращает.

Если вы не хотите, чтобы этот процесс запускался, не вызывайте axios (et c.). Например, вы можете вместо этого поместить функцию, которая вызывает ее в массив, а затем вызвать ее, когда вы будете готовы начать работу:

const arrayOfAxios = [
  () => axios('https://api.github.com/') // *** A function we haven't called yet
];

setTimeout(() => {
  console.log('before call promise');

  Promise.all(arrayOfAxios.map(f => f())).then(res => {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^ *** Calling the function(s)
   console.log({ res });
  });

}, 5000);

Или если вы выполняете ту же операцию над во всех записях массива хранится информация, необходимая для этой операции (например, URL-адреса или объекты параметров для axios):

const arrayOfAxios = [
  'https://api.github.com/' // *** Just the information needed for the call
];

setTimeout(() => {
  console.log('before call promise');

  Promise.all(arrayOfAxios.map(url => axios(url))).then(res => {
// −−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^ *** Making the calls
   console.log({ res });
  });

}, 5000);
...