Typescript: Асинхронные функции
Promise стали самым популярным способом работы с асинхронным кодом в JavaScript. Они позволяют избежать callback hell, а также упрощают работу с асинхронными функциями. TypeScript также поддерживает привычный синтаксис для работы с Promise в виде async/await и типизацию.
const promise = new Promise<number>((resolve, reject) => {
setTimeout(() => {
resolve(42);
}, 1000);
});Promise представляет собой дженерик с типом, который будет возвращен в случае успешного выполнения. В примере выше это тип number.
Чтобы продолжать работать в одном стиле с функциями, которые принимают callback, мы можем промисифцировать их. Для этого нам нужно обернуть функцию в Promise:
const wait = (ms: number): Promise<number> => {
return new Promise((resolve) => {
const timer = setTimeout(() => {
resolve(ms);
}, ms);
});
};Мы можем и не описывать тип возвращаемого значения, так как TypeScript сможет его вывести из типа, который мы передаем в Promise. К тому же из функции, которая помечена как async, Promise возвращается автоматически, и тип возвращаемого значения будет обернут в Promise:
const getHours = async () => {
return new Date().getHours();
};
const hoursPromise: Promise<number> = getHours();Так как Promise, как и контейнер, заворачивает значения внутри себя, мы можем использовать await для получения значения из него:
const hours = await getHours();Как и в JavaScript в TypeScript await может использоваться только внутри функций, которые помечены как async.
Promise вместе с async/await позволяют писать асинхронный код в синхронном стиле и сильно упрощают работу с асинхронным кодом. TypeScript поддерживает этот синтаксис и с помощью дженериков позволяет нам использовать его со всей мощью типизации.
Задание
Реализуйте асинхронный вариант функции map() - asyncMap(). Первым аргументом asyncMap() принимает массив с Promise. Вторым — функцию, которая применяется к каждому элементу. Функция должна вернуть массив с результатами выполнения функции для каждого элемента:
const promisedNumbers = [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)];
asyncMap(promisedNumbers, (num, index) => num * index).then((result) => {
console.log(result); // [0, 2, 6]
});Полезное
Typescript: Асинхронные функции
Promise стали самым популярным способом работы с асинхронным кодом в JavaScript. Они позволяют избежать callback hell, а также упрощают работу с асинхронными функциями. TypeScript также поддерживает привычный синтаксис для работы с Promise в виде async/await и типизацию.
const promise = new Promise<number>((resolve, reject) => {
setTimeout(() => {
resolve(42);
}, 1000);
});Promise представляет собой дженерик с типом, который будет возвращен в случае успешного выполнения. В примере выше это тип number.
Чтобы продолжать работать в одном стиле с функциями, которые принимают callback, мы можем промисифцировать их. Для этого нам нужно обернуть функцию в Promise:
const wait = (ms: number): Promise<number> => {
return new Promise((resolve) => {
const timer = setTimeout(() => {
resolve(ms);
}, ms);
});
};Мы можем и не описывать тип возвращаемого значения, так как TypeScript сможет его вывести из типа, который мы передаем в Promise. К тому же из функции, которая помечена как async, Promise возвращается автоматически, и тип возвращаемого значения будет обернут в Promise:
const getHours = async () => {
return new Date().getHours();
};
const hoursPromise: Promise<number> = getHours();Так как Promise, как и контейнер, заворачивает значения внутри себя, мы можем использовать await для получения значения из него:
const hours = await getHours();Как и в JavaScript в TypeScript await может использоваться только внутри функций, которые помечены как async.
Promise вместе с async/await позволяют писать асинхронный код в синхронном стиле и сильно упрощают работу с асинхронным кодом. TypeScript поддерживает этот синтаксис и с помощью дженериков позволяет нам использовать его со всей мощью типизации.
Задание
Реализуйте асинхронный вариант функции map() - asyncMap(). Первым аргументом asyncMap() принимает массив с Promise. Вторым — функцию, которая применяется к каждому элементу. Функция должна вернуть массив с результатами выполнения функции для каждого элемента:
const promisedNumbers = [Promise.resolve(1), Promise.resolve(2), Promise.resolve(3)];
asyncMap(promisedNumbers, (num, index) => num * index).then((result) => {
console.log(result); // [0, 2, 6]
});Полезное
Ваше упражнение проверяется по этим тестам
import { expect, expectTypeOf, test } from 'vitest';
import asyncMap from './index';
test('asyncMap', async () => {
const result = await asyncMap(
[Promise.resolve(1), Promise.resolve(2)],
(item) => item * 2,
);
expect(result).toEqual([2, 4]);
const result2 = await asyncMap(
[Promise.resolve('one'), Promise.resolve('two'), Promise.resolve('three')],
(item) => item.toUpperCase(),
);
expect(result2).toEqual(['ONE', 'TWO', 'THREE']);
const result3 = await asyncMap(
[Promise.resolve(1), Promise.resolve(2)],
(item, index) => item * index,
);
expect(result3).toEqual([0, 2]);
expectTypeOf(result).toExtend<number[]>();
expectTypeOf(result2).toExtend<string[]>();
});Решение учителя откроется через:
20:00
