Для определения функций в TypeScript можно использовать стрелочные функции или arrow functions. Стрелочные функции представляют выражения типа (параметры) => тело функции
. Например:
const sum = (x: number, y: number) => x + y;
const result = sum(15, 35); // 50
console.log(result);
Если стрелочная функция не требует параметров, то используются пустые круглые скобки. Если передается только один параметр, то скобки можно опустить:
const square = x => x * x;
const hello = () => "hello world"
console.log(square(5)); // 25
console.log(hello()); // hello world
Если тело функции представляет множество выражений, а не просто одно выражение, как в примере выше, тогда можно опять же заключить все выражения в фигурные скобки:
const sum = (x: number, y: number) => {
x *= 2;
return x + y;
};
const result = sum(15, 35); // 65
console.log(result);
Стрелочные функции можно передавать в функцию вместо параметра, который представляет собой функцию:
function mathOp(x: number, y: number, operation: (a: number, b: number) => number): number{
const result = operation(x, y);
return result;
}
console.log(mathOp(10, 20, (x,y)=>x+y)); // 30
console.log(mathOp(10, 20, (x, y) => x * y)); // 200
setTimeout(()=>console.log("Подождали 2 секунды"), 2000)
Promise
-- тип, который делает обещание что-либо выполнить.
У него есть 2 основных метода:
then
-- выполнить операцию после успешного завершения промиса;catch
-- выолнить обработку исключения, которое могло возникнуть при работе промиса.const wait = new Promise((resolve) => setTimeout(resolve, 2000));
wait.then(() => console.log("Подождали 2 секунды"));
С промисами можно работать с помощью операторов async
и await
.
async
-- помечает методы как асинхронные. Это нужно для использования оператора await;await
-- дожидается выполнения асинхронной функции.async function main() {
const wait = new Promise((resolve) => setTimeout(resolve, 2000));
await wait;
console.log("Подождали 2 секунды");
}
main();
Давайте приготовим "суп" последовательно:
async function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function boilWater(){
console.log("Кастрюля с водой поставлена на огонь")
for (let i = 1; i <=10; i++){
await sleep(1000);
console.log(`Кастрюля с водой закипела на ${i*10}%`);
}
}
async function peelPotatoe(){
console.log("Начали чистить картофель")
await sleep(4000);
console.log("Закончили чистить картофель")
}
async function cutPotatoe(){
console.log("Начали резать картофель")
await sleep(4000);
console.log("Закончили резать картофель")
}
async function preparePotatoe(){
console.log("Закинули картофель в кастрюлю")
await sleep(4000);
console.log("Картофель готов")
}
async function makeSoup() {
let startTime = performance.now();
await boilWater();
await peelPotatoe();
await cutPotatoe();
await preparePotatoe()
let endTime = performance.now();
console.log(`Время приготовления: ${(endTime - startTime)/1000}`)
}
makeSoup();
Переработаем код, чтобы некоторые вещи делались асинхронно:
async function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function boilWater(){
console.log("Кастрюля с водой поставлена на огонь")
for (let i = 1; i <=10; i++){
await sleep(1000);
console.log(`Кастрюля с водой закипела на ${i*10}%`);
}
}
async function peelPotatoe(){
console.log("Начали чистить картофель")
await sleep(4000);
console.log("Закончили чистить картофель")
}
async function cutPotatoe(){
console.log("Начали резать картофель")
await sleep(4000);
console.log("Закончили резать картофель")
}
async function preparePotatoe(){
console.log("Закинули картофель в кастрюлю")
await sleep(4000);
console.log("Картофель готов")
}
async function makeSoup() {
let startTime = performance.now();
let bwp = boilWater();
await peelPotatoe().then(cutPotatoe);
await bwp;
await preparePotatoe()
let endTime = performance.now();
console.log(`Время приготовления: ${(endTime - startTime)/1000}`)
}
makeSoup();