Asynchronous պարադիգմը անփոխարինելի է JavaScript-ի համար

Սինխրոն ընդդեմ ասինխրոն

JS-ը մեկ շղթայական լեզու է: Այլ կերպ ասած, JS կոդը կատարվում է տող առ տող կատարման կույտի ներսում: Ինչպես գիտենք, կույտերը FILO են (First In Last Out), այսինքն, քանի դեռ նախորդ առաջադրանքը չի ավարտվել, հաջորդը պետք է սպասի իր հերթին:

Այս դիզայնի առավելությունն այն է, որ այն կարելի է հեշտությամբ հասնել, իսկ կատարման միջավայրը բավականին պարզ է: Բացասական կողմն այն է, որ եթե առաջադրանքներից մեկը հավերժ է պահանջում, մնացածը պետք է հերթ կանգնի: Օրինակ, արտաքին տեսքից զննարկիչը օգտատիրոջ համար «մեռած» է թվում, ինչը հաճախ հանգեցնում է օգտվողի անբավարար փորձի: Դրա հիմքում ընկած պատճառը կարող է լինել այն, որ կոդի բլոկը աշխատում է անսահման հանգույցով, և այդպիսով ամբողջ ծրագիրը խրված է:

JS-ը ներկայացնում է ասինխրոն պարադիգմ այս ծուղակը լուծելու համար: Ասինխրոն զանգերը վերաբերում են նրան, որ մեկ առաջադրանքը չի կատարվում միանգամից (սինխրոն), այլ բաժանվում է տարբեր փուլերի (ասինխրոն): Յուրաքանչյուր առաջադրանք ունի մեկ կամ մի քանի հետադարձ զանգ: Օրինակ, http հարցումները մեծապես հիմնված են ասինխրոն օրինաչափության վրա: Դրանք վարվում են ասինխրոն կերպով, քանի որ հարցումն ուղարկելուց հետո պատասխանն անմիջապես չի վերադառնա: Հետևաբար, հետադարձ զանգերն օգտագործվում են պատասխանը բռնելու համար, իսկ մնացած տրամաբանությունը մշակվում է հետադարձ զանգի ներսում:

Զանգեր

Սա ասինխրոն ծրագրավորման ամենահին լուծումներից մեկն է: Ենթադրենք, կան 2 գործառույթներ f1 և f2, և վերջինս պետք է սպասի, որ առաջինը արդյունք վերադարձնի, որպեսզի այն օգտագործի:

f1()
f2()

Եթե ​​f1-ի գործարկման համար երկար ժամանակ է պահանջվում, մենք կարող ենք ռեֆակտորել f2-ը և այն վերածել f1-ի հետ կանչի:

function f1(callback) {
   setTimeout(function () {
     // f1’s code
     // ..
     callback()
   }, 2000)
}

Երբ f1 կանչվում է, որպես փաստարկ օգտագործվում է f2:

f1(f2)

Օգտագործելով այս մեթոդը, f1-ը չի դառնա հավելվածի արգելափակող, և սա շատ բարդ տրամաբանությունը դադարեցնելու խելացի միջոց է մինչև հիմնական տրամաբանության ընթացքը:

Pro. հետադարձ զանգերը պարզ են հասկանալի և կիրառելի:

Դեմ. երբ տրամաբանությունը չափազանց բարդ է դառնում, հետադարձ զանգերը դժվարանում են կարդալ և պահպանել, երբ յուրաքանչյուր մաս դառնում է խիստ զուգակցված:

Իրադարձությունների վրա հիմնված ծրագրավորում

Մեկ այլ լուծում հիմնված է իրադարձությունների վրա. Անկախ նրանից, թե առաջադրանքը կատարվում է ամբողջությամբ, հիմնված է որոշակի տեսակի իրադարձության տեղի ունենալ-չլինելու վրա:

Սկզբում մենք կցում ենք իրադարձություն f1-ին:

f1.on(‘done’, f2)

Կոդի այս տողը նշանակում է, որ երբ «կատարված» իրադարձությունը գործարկվի, կկանչվի f2:

Հաջորդը, եկեք վերամշակենք f1-ը:

function f1() {
   setTimeout(function () {
     // f1’s code
     f1.trigger(‘done’)
   }, 2000)
}

f1.trigger('done') նշանակում է գործարկել «կատարված» իրադարձությունը f1-ի տրամաբանությունը գործարկելուց անմիջապես հետո, և f2-ը հետևում և կատարում է համապատասխանաբար:

Pro. այս օրինաչափությունը հեշտ է հասկանալի, հեշտ է անջատվել, և, հետևաբար, մոդուլյարացումը կարող է օգտագործվել դրա հետ մեկտեղ:

Դեմ. ամբողջ հավելվածը դառնում է իրադարձությունների վրա հիմնված, և տրամաբանական հոսքը դառնում է անհասկանալի և դժվար հասկանալի:

Հրապարակել/Բաժանորդագրվել

Մենք կարող ենք իրադարձություններին վերաբերվել որպես ազդանշանների: Ենթադրենք, որ կա ազդանշանային կենտրոն, և այն ազդանշան է հրապարակում, երբ առաջադրանքն ավարտվում է, որպեսզի մյուս առաջադրանքները կարողանան բաժանորդագրվել այս ազդանշանին և գործել համապատասխանաբար: Սա, այսպես կոչված, հրապարակել/բաժանորդագրվել օրինակ կամ դիտորդի օրինաչափություն է:

Օգտագործելով Ben Alman’s Tiny Pub/Sub-ը որպես օրինակ:

Նախ, f2-ը բաժանորդագրվում է «կատարված» ազդանշանին ազդանշանային կենտրոնի միջոցով:

jQuery.subscribe(‘done’, f2)

Հաջորդը, վերաշարադրեք f1 հետևյալը.

function f1() {
   setTimeout(function () {
     // f1’s code
     jQuery.publish(‘done’)
   }, 2000)
}

F1-ի կոդը գործարկելուց հետո այն հրապարակում է «կատարված» ազդանշան, և քանի որ f2-ը բաժանորդագրվել է նույն ազդանշանին, այն գործարկվում է դրանից հետո:

Բացի այդ, f2-ը կարող է նաև չեղարկել բաժանորդագրությունը կատարումից հետո։

jQuery.unsubscribe(‘done’, f2)

Pro. այս օրինաչափությունը նման է իրադարձությունների վրա հիմնված օրինաչափությանը, բայց մի փոքր ավելի լավ է այնպես, որ մենք կարող ենք ավելի ամբողջական պատկերացում կազմել հավելվածի մասին՝ ազդանշանի միջոցով ազդանշանների և բաժանորդների թվի հաշվառման միջոցով: կենտրոն.

Խոստումներ

Խոստումներ են առաջարկվել CommonJS խմբի կողմից ասինխրոն ծրագրավորման համար ստանդարտացված լուծում տրամադրելու վերաբերյալ: Պարզ ասած, յուրաքանչյուր ասինխրոն առաջադրանք վերադարձնում է խոստացված օբյեկտ, և այս օբյեկտն ունի այնուհետև ֆունկցիա, որն ընդունում է հետ կանչերը որպես փաստարկներ: Օրինակ՝ f1/f2-ի համար խոստումներ օգտագործելով.

f1().then(f2)

f1-ը պետք է վերաշարադրվի հետևյալով.

function f1() {
   var dfd = $.Deferred()
   setTimeout(function () {
   // f1’s code
   did.resolve()
  }, 2000)
 return did.promise
}

Pro. խոստումների օգտագործման ամենաակնհայտ առավելությունն այն է, որ հետադարձ զանգերը շղթայված են միմյանց հետ, ինչը հեշտացնում է կոդը կարդալը: Բացի այդ, հզոր API-ների մի ամբողջ շարք հասանելի է օգտագործման համար:

Օրինակ՝ օգտագործելով բազմաթիվ հետադարձ զանգեր:

f1().then(f2).then(f3)

Նաև կարգավորեք սխալները հետ կանչերի միջոցով:

f1().then(f2).fail(f3)

Կա բոնուս, որը գալիս է խոստումների օգտագործման հետ, որոնք նախորդ օրինաչափությունները չեն կարող ապահովել: Այսինքն, եթե առաջադրանքն ավարտվելուց ՀԵՏՈ հետադարձ զանգը կցվում է, այս հետ կանչը անմիջապես կանչվում է: Այս դեպքում, դուք չպետք է անհանգստանաք, որ բացակայում եք իրադարձությունների մշակիչի կարգավորումը կամ ազդանշանի բաժանորդագրվելը: Թեև իսկապես կա ուսուցման կոր՝ խոստումներ վերցնելու համար:

Հղում: