Как вернуть promise массива в node.js?

Пользователь

от ludie , в категории: JavaScript , 2 года назад

Как вернуть promise массива в node.js?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от francis_schuster , 2 года назад

@ludie 

Для возврата promise массива в Node.js, можно использовать функцию Promise.all(). Она принимает массив промисов и возвращает новый промис, который разрешается, когда все промисы в массиве разрешены.


Пример:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
function getArrayOfPromises() {
  const promise1 = Promise.resolve(1);
  const promise2 = Promise.resolve(2);
  const promise3 = Promise.resolve(3);

  return [promise1, promise2, promise3];
}

const promiseArray = getArrayOfPromises();

Promise.all(promiseArray)
  .then((result) => {
    console.log(result); // [1, 2, 3]
  })
  .catch((error) => {
    console.log(error);
  });


В этом примере функция getArrayOfPromises() возвращает массив из трех промисов. Затем мы передаем этот массив в Promise.all(), который возвращает новый промис. Когда все промисы в массиве будут разрешены, новый промис также будет разрешен, и мы сможем получить результат с помощью метода then(). Если хотя бы один из промисов в массиве отклонен, новый промис будет отклонен, и мы сможем обработать ошибку с помощью метода catch().

Пользователь

от terrence , год назад

@ludie 

Ответ отличный! Только хотел бы добавить, что массив промисов, передаваемый в Promise.all(), может содержать не только константы типа Promise.resolve(), но и любые асинхронные операции, возвращающие промисы. Например, запросы к базе данных или к внешнему API.


Также стоит упомянуть, что если хотя бы один из промисов в массиве будет отклонен, Promise.all() сразу же будет отклонен, и промис массива не будет разрешен. В таком случае, выполнится метод catch().


Пример с асинхронными операциями:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function getDataFromDB() {
  return new Promise((resolve, reject) => {
    // Запрос к базе данных
    // ...
    if (/* Запрос успешен */) {
      resolve("Data from DB");
    } else {
      reject("Error retrieving data from DB");
    }
  });
}

function getDataFromAPI() {
  return new Promise((resolve, reject) => {
    // Запрос к API
    // ...
    if (/* Запрос успешен */) {
      resolve("Data from API");
    } else {
      reject("Error retrieving data from API");
    }
  });
}

const promiseArray = [getDataFromDB(), getDataFromAPI()];

Promise.all(promiseArray)
  .then((result) => {
    console.log(result); // ["Data from DB", "Data from API"]
  })
  .catch((error) => {
    console.log(error);
  });


В этом примере функции getDataFromDB() и getDataFromAPI() возвращают промисы, которые представляют асинхронные операции (например, запросы к базе данных и внешнему API). Массив промисов передается в Promise.all(), который разрешается только тогда, когда все операции завершены успешно. В результате мы получим массив с данными каждой операции. Если хотя бы одна операция завершится с ошибкой, новый промис от Promise.all() будет отклонен, и мы сможем обработать ошибку с помощью метода catch().