Klase ng Promise sa JavaScript
Sa artikulong ito, ipapaliwanag namin ang klase ng Promise sa JavaScript.
YouTube Video
Promise
Ang klase ng Promise
ay isang klase para sa paghawak ng mga asynchronous na operasyon. Hinahawakan nito ang mga resulta kung ang operasyon ay nagtagumpay, o ang paghawak sa error kung nabigo ito. Tradisyonal na ginamit ang mga callback function kapag kailangan mong maghintay sa pagtatapos ng isang asynchronous na operasyon, ngunit ginagawa itong mas malinaw at makapangyarihan ng Promise
.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => resolve("Done!"), 1000);
3});
4
5// Displays "Done!" after 1 second
6promise.then(result => console.log(result));
- Ang code na ito ay isang halimbawa ng asynchronous na proseso na nagpapakita ng "Done!" pagkatapos ng isang segundo.
- Una, isang bagong
Promise
object ang nilikha gamit angnew Promise
. Ang argument ay isang function na tumatanggap ng dalawang callback:resolve
para sa tagumpay atreject
para sa kabiguan. - Ginagamit ang
setTimeout
upang tawagin angresolve()
pagkatapos ng isang segundo. - Ang
then()
na method ngpromise
object ay naghihintay na matapos at ipinapakita ang resulta.
- Una, isang bagong
Pangunahing Istruktura
Ang Promise
ay isang object na nauuwi sa alinman sa tagumpay o kabiguan.
1const promise = new Promise((resolve, reject) => {
2 // Asynchronous operation
3 // Flag indicating whether the operation was successful
4 const success = true;
5
6 if (success) {
7 resolve('Operation successful!');
8 } else {
9 reject('An error occurred');
10 }
11});
- Kapag tagumpay, tinatawag ang
resolve()
. - Kapag kabiguan, tinatawag ang
reject()
.
Ang object na Promise
ay may tatlong estado.
1promise
2 .then((result) => {
3 console.log(result);
4 })
5 .catch((error) => {
6 console.error(error);
7 })
- Naghihintay
- Hindi pa tapos ang asynchronous na proseso.
- Natupad
- Naging matagumpay ang asynchronous na proseso, at ang resulta ay ibinalik ng
resolve()
. Ang resulta ay natanggap gamit angthen()
method.
- Naging matagumpay ang asynchronous na proseso, at ang resulta ay ibinalik ng
- Tinanggihan
- Nabigo ang asynchronous na proseso, at nagkaroon ng error sa pamamagitan ng
reject()
. Ang error ay natanggap gamit angcatch()
method.
- Nabigo ang asynchronous na proseso, at nagkaroon ng error sa pamamagitan ng
Mga Paraan ng then()
at catch()
Sa paggamit ng isang Promise
, maaari mong tukuyin ang gagawin kapag natapos ang isang asynchronous na operasyon. Para dito, ginagamit mo ang mga paraan ng then()
at catch()
.
then()
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise.then((result) => {
6 console.log(result); // "Operation successful!"
7});
- Ang paraan ng
then()
ay nagtutukoy ng isang function na tatawagin kapag angPromise
ay nagtagumpay.
catch()
1const promise = new Promise((resolve, reject) => {
2 reject('An error occurred');
3});
4
5promise.catch((error) => {
6 console.error(error); // "An error occurred"
7});
- Ang paraan ng
catch()
ay nagtutukoy ng isang function na tatawagin kapag angPromise
ay nabigo.
Paraan ng finally()
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise
6 .then((result) => {
7 console.log(result);
8 })
9 .catch((error) => {
10 console.error(error);
11 })
12 .finally(() => {
13 console.log('The operation has completed');
14 });
- Ang paraan ng
finally()
ay nagtatakda ng code na isasagawa sa huli anuman kung angPromise
ay nagtagumpay o nabigo.
then()
Chain
Ang then()
ay nagbabalik ng bagong Promise
, kaya maaari mong i-chain ang susunod na then()
.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => {
3 resolve(1);
4 }, 1000);
5});
6
7promise
8 .then(result => {
9 console.log(result); // 1
10 return result + 1;
11 })
12 .then(result => {
13 console.log(result); // 2
14 return result + 1;
15 })
16 .then(result => {
17 console.log(result); // 3
18 })
19 .catch(error => {
20 console.error(error.message); // Something went wrong
21 });
- Sa code na ito, ang unang
resolve()
ay nagpapasa ng halagang 1, at bawat halagang ibinabalik ng isangthen
ay ipinapasa sa kasunod nathen
. - Sa pamamagitan ng paggamit ng
catch()
, maaari mong hawakan ang anumang error na mangyari sa chain sa iisang lugar.
Praktikal na Halimbawa
Halimbawa, madalas na ginagamit ang Promises
upang kumuha ng data mula sa isang server. Tignan natin ang isang halimbawa gamit ang fetch()
API.
1fetch('https://codesparklab.com/json/example.json')
2 .then(response => {
3 if (!response.ok) {
4 throw new Error('Network error');
5 }
6 return response.json();
7 })
8 .then(data => {
9 console.log(data);
10 })
11 .catch(error => {
12 console.error('Error:', error);
13 });
- Sa code na ito, dahil ang
fetch()
ay nagbabalik ngPromise
, ginagamit angthen()
upang iproseso ang data matapos matanggap ang tugon mula sa server. Ang mga error ay hinahawakan gamit angcatch()
.
Paghawak ng Maramihang Promises
Promise.all()
Upang magpatakbo ng maramihang Promises
nang sabay-sabay at magpatuloy lamang kung lahat ay magtagumpay, gamitin ang Promise.all()
.
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.resolve(2);
3const promise3 = Promise.resolve(3);
4
5Promise.all([promise1, promise2, promise3])
6 .then((results) => {
7 console.log(results); // [1, 2, 3]
8 })
9 .catch((error) => {
10 console.error('Error :', error);
11 });
- Ang
then()
ay tinatawag lamang kung lahat ngPromises
ay nagtagumpay. Angcatch()
ay tinatawag kung kahit isa ay nabigo.
Promise.allSettled()
Kung gusto mong patakbuhin ang maraming Promise
ng sabay-sabay at makuha lahat ng resulta kahit anuman ang kalabasan (tagumpay o kabiguan), gamitin ang Promise.allSettled()
.
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.reject("Failed");
3const promise3 = Promise.resolve(3);
4
5Promise.allSettled([promise1, promise2, promise3])
6 .then((results) => {
7 results.forEach(result => console.log(result));
8 // [
9 // { status: 'fulfilled', value: 1 },
10 // { status: 'rejected', reason: 'Failed' },
11 // { status: 'fulfilled', value: 3 }
12 // ]
13 });
- Ang
then()
ay tatawagin kapag ang lahat ngPromise
ay natapos na (fulfilled o rejected). Bawat resulta ay may kasamangstatus
na property ('fulfilled'
o'rejected'
). Kahit may ilang mabigo, hindi nito naaapektuhan ang iba pang mga operasyon.
Promise.race()
Ang Promise.race()
ay nagbabalik ng resulta ng Promise
na unang magtapos, kahit ito ay natupad o tinanggihan.
1const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
2const promise2 = new Promise((resolve) => setTimeout(resolve, 500, 'Second'));
3
4Promise.race([promise1, promise2]).then((result) => {
5 console.log(result); // "First"
6});
- Tulad ng sa halimbawang ito, ang resulta ng unang natapos na
Promise
ay ibinabalik.
Kaugnayan sa async
/await
Ang paggamit ng sintaks na async
/await
ay nagbibigay-daan upang mas intuitive na maisulat ang mga Promises
. Ang isang async
na function ay laging nagbabalik ng isang Promise
, at ang await
ay naghihintay upang matapos ang Promise
.
1async function fetchData() {
2 try {
3 const response = await fetch('https://codesparklab.com/json/example.json');
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error('Error :', error);
8 }
9}
10
11fetchData();
Gamit ang async
/await
sa ganitong paraan, ang mga asynchronous na operasyon ay maaaring isulat na parang synchronous na code, na mas madaling basahin.
Buod
- Ang
Promise
ay isang object para sa paghawak ng tagumpay o kabiguan ng mga asynchronous na operasyon. - Hawakan ang matagumpay na mga operasyon gamit ang
then()
at ang mga error gamit angcatch()
. - Ang
finally()
ay nagtatakda ng code na isinasagawa sa huli, hindi alintana kung tagumpay o kabiguan. - Maaari mong hawakan ang maramihang mga
Promise
nang sabay-sabay gamit angPromise.all()
oPromise.race()
. - Ang
async
/await
ay sintaks para sa mas simpleng pagsulat ng mgaPromise
.
Maaari mong sundan ang artikulo sa itaas gamit ang Visual Studio Code sa aming YouTube channel. Paki-check din ang aming YouTube channel.