Async/Await-ը ներդրվել է JavaScript-ին, որպեսզի հաղթահարվի հետադարձ զանգի դժոխք կոչվող խնդիրը: Մինչ async/wait մի քանի «միջանկյալ» լուծումներ փորձեցին լուծել այս խնդիրը.
- Օգտագործելով խոստումներ
- Օգտագործելով գեներատորներ և co գրադարան
- Օգտագործելով async/wait որպես շարահյուսական շաքար երկրորդ լուծման համար
Երբ մենք կիրառում ենք լուծում 2-ը կամ 3-ը, կա վտանգ, որ մենք չենք օգտագործում node.js-ի ամենամեծ վաճառքի կետը: Համենայն դեպս, դա node.js-ի վաճառքի ամենամեծ կետն էր այն ժամանակ, երբ այն ձեռք բերեց ուշադրություն: Որն է ասինխրոն բնույթը և չարգելափակող I/O:
# Inefficient let result1 = await fetch('/request1'); let result2 = await fetch('/request2'); doSomeCalculation(result1);
Ինչպես տեսնում եք վերևի կոդում, երկրորդ հարցումը կկատարվի միայն առաջին հարցման պատասխանից հետո, այնուհետև ծրագիրը սպասում է երկրորդ հարցման ավարտին: Երկրորդ հարցումը կատարելուց հետո միայն կանչվում է doSomeCalculation ֆունկցիան: Երկու հարցումների ժամանակ պրոցեսորն անգործուն էր:
Ճիշտն ասած, շատ դեպքերում դա նշանակություն չունի։ Հիշեք. «վաղաժամ օպտիմալացումը բոլոր չարիքների հիմնական պատճառն է» (տես [01]): Ինչևէ, ավելի արագ մտածելու համար մենք կարող ենք գրել մեր կոդը այսպես.
# Efficient let request1 = fetch('/request1'); let request2 = fetch('/request2'); let result1 = await request1; doSomeCalculation(result1); let result2 = await request2;
Այս կոդը ունի երկու կատարողական առավելություն.
- Մենք երկու հարցումն ուղարկում ենք միաժամանակ՝ չսպասելով առաջինի ավարտին:
- Ենթադրելով, որ առաջին հարցումը կատարվում է շատ ավելի արագ, քան երկրորդ հարցումը, մենք արդեն կարող ենք օգտագործել պրոցեսորը և doSomeCalculation-ը՝ սպասելով երկրորդ հարցման ավարտին: Այս դեպքում ցուցադրված կոդը ավելի լավ է, քան Promise.all([request1, request2]):
Հարգանքներով,
Օլիվերը աշխատում է MonsterWriter-ի վրա