Async/Await-ը ներդրվել է JavaScript-ին, որպեսզի հաղթահարվի հետադարձ զանգի դժոխք կոչվող խնդիրը: Մինչ async/wait մի քանի «միջանկյալ» լուծումներ փորձեցին լուծել այս խնդիրը.

  1. Օգտագործելով խոստումներ
  2. Օգտագործելով գեներատորներ և co գրադարան
  3. Օգտագործելով 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;

Այս կոդը ունի երկու կատարողական առավելություն.

  1. Մենք երկու հարցումն ուղարկում ենք միաժամանակ՝ չսպասելով առաջինի ավարտին:
  2. Ենթադրելով, որ առաջին հարցումը կատարվում է շատ ավելի արագ, քան երկրորդ հարցումը, մենք արդեն կարող ենք օգտագործել պրոցեսորը և doSomeCalculation-ը՝ սպասելով երկրորդ հարցման ավարտին: Այս դեպքում ցուցադրված կոդը ավելի լավ է, քան Promise.all([request1, request2]):

Հարգանքներով,

Օլիվերը աշխատում է MonsterWriter-ի վրա

[01] https://ubiquity.acm.org/article.cfm?id=1513451#:~:text=Trying%20to%20do%20the%20optimization,best%20practice%20among% 20software%20 engineers.