Typescript: Асинхронные функции
В JavaScript Promise — это самый популярный способ работы с асинхронным кодом. Они позволяют избежать 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. Кроме того, Promise возвращается автоматически из любой функции, помеченной как async. Тип возвращаемого значения будет обернут в Promise:
const getHours = async () => {
return new Date().getHours();
};
const hoursPromise: Promise<number> = getHours();Как и контейнер, Promise заворачивает значения внутри себя, поэтому мы можем использовать await для получения значения из него:
const hours = await getHours();В TypeScript await используется так же, как в JavaScript.
В итоге, 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: Асинхронные функции
В JavaScript Promise — это самый популярный способ работы с асинхронным кодом. Они позволяют избежать 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. Кроме того, Promise возвращается автоматически из любой функции, помеченной как async. Тип возвращаемого значения будет обернут в Promise:
const getHours = async () => {
return new Date().getHours();
};
const hoursPromise: Promise<number> = getHours();Как и контейнер, Promise заворачивает значения внутри себя, поэтому мы можем использовать await для получения значения из него:
const hours = await getHours();В TypeScript await используется так же, как в JavaScript.
В итоге, 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
