Մաս 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-ում: