Մաս 1. Խոստումնալից առաջադրանք կատարելը:

Մենք անընդհատ օգտագործում ենք JavaScript Promises-ը՝ սկսած API-ի բեռնումից մինչև ինչ-որ բանի սպասել: Բայց հավատացեք, թե ոչ, մեզանից ոչ շատերը հստակ գիտեն, թե որն է Խոստման ճշգրիտ սահմանումը: Լավ է, եթե չանենք: Մենք շատ բաներ չգիտենք, բայց մենք դեռ օգտագործում ենք դրանք ամեն օր:

Այնուամենայնիվ, երբ խոսքը վերաբերում է իրականացմանը, սահմանման մասի վերաբերյալ գիտելիքների պակասը միշտ վերադառնում է մեզ ի վերջո վնասելու: Պարզապես հիշեք սա. Երբ դուք ցանկանում եք ինչ-որ դժվար կամ բարդ բան անել, դուք ցանկանում եք համոզվել, որ կարող եք հիշել նպատակը, քանի որ ճանապարհին բոլոր տեսակի շեղումների պատճառով կարող է լինել շատ հեշտ կորցնել ձեր արածի հետքերը: Խոստումն այստեղ բացառություն չէ։

Ի՞նչ է անում խոստումը:

Եկեք արագ նայենք դրա բնորոշ օգտագործմանը.

const p = new Promise((resolve, reject) => { resolve(3) })
p.then(res => { console.log(res })
 .catch(e => { console.error(e) })

Մենք կարող ենք խոստում ստեղծել՝ նրան առաջադրանք (ֆունկցիա) մատակարարելով: Դրանից հետո մենք կարող ենք կարգավորել այն then-ով, երբ այս խնդիրը լուծվի: Եթե ​​ինչ-ինչ պատճառներով առաջադրանքը մերժվի, մենք կարող ենք կարգավորել սխալը catch-ում:

Թեև օգտագործումը բավականաչափ պարզ է, առաջադրանքը պետք է գրվի որպես գործառույթ: Եվ ֆունկցիան վերցնում է երկու ֆունկցիա՝ resolve և reject անուններով.

const taskFn = (resolve, reject) => { ... }

Անմիջապես սա դառնում է Ֆունկցիոնալ ծրագրավորում 101: Հաշվի առնելով այն ուղիները, որոնցով կարող եք որոշել, թե ինչպես եք լուծում կամ մերժում, մենք կարող ենք սահմանել առաջադրանքի գործառույթը: Ֆունկցիոնալ ծրագրավորման մեջ ուղիները (կամ միջոցները) կարող են սահմանվել ֆունկցիաների միջոցով: Ծրագրավորման այլ լեզուներում դրանք սովորաբար սահմանվում են դասերի միջոցով: Եթե ​​դուք գործառույթը/դասը վերցնեք որպես էություն, որը կարող է ներարկվել մեկ այլի մեջ, կարող եք քիչ թե շատ նույն կերպ վարվել նրանց հետ:

Ի՞նչ է խոստումը:

Լավ, երբ սահմանված է առաջադրանքի գործառույթը, եկեք վերադառնանք Խոստմանը.

const taskFn = (resolve, reject) => { resolve(5) }
const p = new Promise(taskFn).then(res => {})

Խոստումը ձեզ չի տա առաջադրանքից վերադարձված որևէ արժեք: Վերոնշյալ օրինակը լուծում է 5 թիվը առաջադրանքից, բայց Խոստումը p-ը ձեզ դա չի տա: Որովհետև դա խոստում է: Այն խոստանում է ձեզ (ապագայում), որ եթե հարցնեք then-ի միջոցով և երբ խնդիրը լուծվի, արժեքը կարող է վերադարձվել: Մեր դեպքում, մենք կստանանք 5 թիվը then-ի ներսում:

Ավելի ճշգրիտ սահմանմամբ՝ Խոստումը պահածոյացված խնդիր է: Խոստումը ստեղծվելուց հետո այն պարտադիր չէ, որ սկսի առաջադրանքը: Հետևաբար առաջադրանքի արդյունքը չպետք է հասանելի լինի ստեղծման ժամանակ: «չպետք է»-ի մասին հատվածը մի քիչ ավելի շատ բացատրություն է պահանջում։ Քանի որ աննշան առաջադրանքը կարող է չափազանց արագ աշխատել և քիչ ժամանակ խլել: Բայց նույնիսկ նման առաջադրանքի համար Խոստումը չի կարող անմիջապես կանչել այն և ավարտել այն: Ընդհակառակը, այն կարող է միայն խոստանալ կանչել այն, հետևաբար, որոշակի իմաստով, Խոստումը մեկնարկային գծից առաջ ավելացնում է որոշակի տարածություն/ժամանակ: Մենք կտեսնենք, թե ինչպես կարելի է դրան հասնել կոդով, երբ հասնենք իրականացմանը:

Ի՞նչ է «then'»-ը:

Խոստման ստեղծման կարգով, այժմ գալիս է մեկ այլ հայտարարություն then, թե կոնկրետ ինչ է then-ը:

.then(resolve)
.then(value => {})

then-ը վերցնում է ֆունկցիա, որը սահմանում է, թե ինչ անել, երբ առաջադրանքն ավարտվի: Ըստ էության, սա ծրագրավորման մեկ այլ գործառույթ է 101: then-ը շատ կապ չունի հենց առաջադրանքի հետ, փոխարենը, այն զբաղվում է առաջադրանքից վերադարձված արժեքի հետ, թե ինչ անել: Հետևաբար value => {} ֆունկցիան կոչվում է նաև resolve ֆունկցիա:

Եթե ​​then-ը գրված չէ Խոստման համար, ապա ոչինչ կարևոր չէ, երբ առաջադրանքն ավարտվի, քանի որ մենք, այնուամենայնիվ, ծանուցում չենք ստանա, և ոչ ոք չգիտի, թե ինչ է պատահել այդ առաջադրանքին:

Եթե ​​then-ը գրված է Promise-ի համար, ապա resolve ֆունկցիան կկանչվի, երբ առաջադրանքն ավարտվի, և, ամենայն հավանականությամբ, վերածվում է արժեքի: Հիշեք, որ դա միայն առաջադրանքի ավարտից հետո է, ոչ թե առաջադրանքի ավարտից առաջ կամ առաջադրանքը սահմանվելուց հետո: Այստեղ ամենատարածված պրակտիկան այն է, որ առաջադրանքը կարող է տևել 3 վայրկյան: 3 վայրկյան անց resolve-ը կանչվում է: Այստեղ այնքան էլ ակնհայտ չէ, որ եթե առաջադրանքի կատարման համար պահանջվում է 0,1 վայրկյան, resolve-ը կանչվում է 0,1 վայրկյանից հետո: Առաջադրանքը կարող է տևել 0,000001 վայրկյան, ուստի պետք է մի փոքր ուշանալ՝ սպասելու մինչև resolve-ը կանչվի: Այս հասկացողությունը կօգնի մեզ իրականացնել Խոստումը, երբ հասնենք օրենսգրքին:

Եզրակացություն

Մենք կկարողանանք զրոյից իրականացնել Խոստումը II մասում: Եվ այս մաս I-ում մենք տեսնում ենք, թե ինչպես է Promise-ը կատարում առաջադրանքը: Օգտագործելով Promise-ը, մենք բաժանում ենք առաջադրանքի և առաջադրանքների կատարման սահմանումը երկու առանձին աշխատանքի: Առաջինը սահմանվում է Promise կոնստրուկտորում, մինչդեռ երկրորդը սահմանվում է then հայտարարության մեջ: Իր բնույթով, Promise-ի հետ կապված առաջադրանքը ժամանակ է պահանջում գործելու համար և հարմար է համաժամեցված գործողության համար: Բայց նաև հիշեք, որ Խոստումը պետք էօգտագործվի հետաձգված առաջադրանքի համար: Եթե ​​դուք հետաքրքրված եք անմիջապես կանչվող առաջադրանքով, խնդրում ենք հաշվի առնել հիմնական գործառույթի զանգը:

Ավելի շատ բովանդակություն PlainEnglish.io կայքում: Գրանցվեք մեր անվճար շաբաթական տեղեկագրին: Հետևեք մեզ Twitter, LinkedIn և Discord-ում: