⊗jsSpPrmInr 162 of 294 menu

Utangulizi wa Ahadi (Promises) katika JavaScript

Tayari unajua kuwa matumizi ya mfumo wa wito wa nyuma (callback) ya ushindani kwa urahisi husababisha hali ya callback hell. Kwa hivyo, katika JavaScript ilianzishwa mfumo mpya uitwao ahadi (promise). Wacha tujifunze mfumo huu.

Ahadi (Promise) inawakilisha kitu (object), ambacho kimoja kwa mabadiliko hupewa kitendakazi, ndani yake tunahitaji kuweka msimbo wetu usiofanana wa wakati mmoja (asynchronous code):

let promise = new Promise(function() { // msimbo usiofanana wa wakati mmoja (asynchronous code) });

Kama unavyoona, nimeandika kitu chenye ahadi katika kigeuzi promise. Mahali pengine katika msimbo naweza kutumia kigeuzi hiki kitendo then, kukiambia kitendakazi na msimbo, ambao unapaswa kutekelezwa ukimalizika msimbo usiofanana wa wakati mmoja, ulioandikwa wakati wa kuunda ahadi hii:

promise.then(function() { // itatekelezwa ukimalizika msimbo usiofanana wa wakati mmoja });

Inasikika kutatanisha, kwa hivyo wacha tuangalie kwa mfano. Hebu nina msimbo usiofanana wa wakati mmoja kama huu:

setTimeout(function() { let result = [1, 2, 3, 4, 5]; }, 3000);

Hebu nataka kutatua kwake kazi yetu kuu ya ushindani: kutekeleza msimbo fulani baada ya kipima muda kukimbia. Wakati huo huo sitaki kuweka msimbo huo ndani ya kipima muda yenyewe na nataka, ili katika msimbo huu kwa namna fulani kuingie matokeo, ulioandikwa na mimi katika kigeuzi result. Kwa ujumla, tulitatua tatizo hili katika masomo yaliyopita kupitia wito wa nyuma (callbacks) na usajili. Hebu sasa tuangalie, jinsi ya kufanya hivyo kupitia ahadi.

Kwa kuanza, tunahitaji kufunika msimbo wetu usiofanana wa wakati mmoja ndani ya ahadi:

let promise = new Promise(function() { setTimeout(function() { let result = [1, 2, 3, 4, 5]; }, 3000); });

Hii, hata hivyo, haitoshi. Tunapaswa kwa njia wazi kuonyesha, kwamba msimbo wetu usiofanana wa wakati mmoja umekwisha. Katika hili, itatusaidia kitendakazi maalum cha kumaliza, kinachoingia kiotomatiki katika mabadiliko ya kwanza ya kitendakazi, ikiwa imebainishwa:

let promise = new Promise(function(resolve) { // tunabainisha mabadiliko setTimeout(function() { let result = [1, 2, 3, 4, 5]; }, 3000); });

Kwa kutumia kitendakazi cha kumaliza, tunaweza kwa wazi kuonyesha ahadini, kwamba msimbo usiofanana wa wakati mmoja umekwisha. Kwa hili, tunapaswa kiita kitendakazi hiki katika mahali tunapohitaji:

let promise = new Promise(function(resolve) { setTimeout(function() { let result = [1, 2, 3, 4, 5]; resolve(); // tumemaliza ahadi }, 3000); });

Wakati huo huo, ikiwa tunataka kupeleka nje kwa namna fulani matokeo ya msimbo usiofanana wa wakati mmoja, tunaweza kupeleka kwa mabadiliko yetu ya kitendakazi cha kumaliza:

let promise = new Promise(function(resolve) { setTimeout(function() { let result = [1, 2, 3, 4, 5]; resolve(result); // tunapeleka matokeo }, 3000); });

Inawezekana, bila shaka, kuondoa kigeuzi cha kati:

let promise = new Promise(function(resolve) { setTimeout(function() { resolve([1, 2, 3, 4, 5]); }, 3000); });

Sasa katika sehemu nyingine yoyote tunaweza kiita kitendo then cha ahadi yetu:

promise.then(function() { // itafanya kazi ukimalizika ahadi });

Matokeo ya kazi ya ahadi yataingia katika mabadiliko ya kwanza ya kitendakazi, ikiwa tutataka kuibainisha:

promise.then(function(result) { console.log(result); // itaonyesha orodha (array) yenye matokeo });

Tengeneza ahadi, ndani yake itakuwa na kucheleweshwa kwa 5 sekunde, baada ya hapo ahadi inapaswa kutekelezwa, kwa matokeo yake kurudisha maandishi fulani. Onyesha maandishi haya kwenye skrini.

Kiswahili
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Tunatumia kuki kwa ajili ya uendeshaji wa tovuti, uchambuzi na ubinafsishaji. Usindikaji wa data unafanyika kulingana na Sera ya Faragha.
kubali yote sanidi kataa