Обещания являются неотъемлемой частью асинхронного кода в 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?