Ускорение выполнения обещаний в JavaScript

Обещания являются неотъемлемой частью асинхронного кода в JavaScript. Мы часто сталкиваемся с необходимостью одновременного выполнения нескольких обещаний, которые не зависят друг от друга. Мы можем добиться этого, используя Promise.all в JavaScript. Promise.all — это обещание, предоставляемое JavaScript, которое принимает массив обещаний и разрешается, когда все они будут разрешены.

Предположим, вам нужно получить данные из 3 различных API. Каждому API требуется около 3 секунд для ответа. Обычный код без параллелизма выглядел бы следующим образом:

async function fetchData() {
  const metadata = await getMetadata(); 
  const products = await getProducts();
  const categories = await getCategories();

  return { metadata, products, categories };
}
Вход в полноэкранный режим Выход из полноэкранного режима

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

async function fetchData() {
  const metadata = getMetadata();
  const products = getProducts();
  const categories = getCategories();

  return await Promise.all([
    metadata,
    products,
    categories,
  ]);
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь мы не ждем metadata перед products. Вместо этого все данные получаются одновременно. Эта техника является довольно мощной и ускоряет ваш код. Эта техника также позволяет получать данные на основе определенных входных данных. Предположим, вы хотите получить подробную информацию о продукте для списка продуктов. Вы можете рефакторизовать свои обещания следующим образом:

async function fetchProductDetails(ids) {
  const productDetails = await Promise.all(
    ids.map(id => getProduct(id))
  );
  return productDetails;
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Поскольку JavaScript является однопоточным, параллелизм не может быть достигнут, если вы не создадите дочерний процесс для каждого обещания. Создание процесса — это дорогостоящая операция, и есть определенные накладные расходы, которые делают ее менее жизнеспособной. Promise.all — хорошая альтернатива для достижения параллелизма и ускорения кода. Опять же, это зависит от проблемы, которую вы пытаетесь решить. Какие у вас есть методы ускорения выполнения обещаний в JavaScript?

Оцените статью
devanswers.ru
Добавить комментарий