فئة الوعد في TypeScript
توضح هذه المقالة فئة الوعد في TypeScript۔
YouTube Video
الوعد
فئة Promise
في TypeScript تشبه بشكل أساسي الفئة Promise
في JavaScript۔ Promise
هي فئة مدمجة للتعامل مع العمليات غير المتزامنة، وتمثل نتيجة العملية غير المتزامنة عند اكتمالها۔ هنا نوضح الاستخدام الأساسي للوعد والمفاهيم ذات الصلة۔
الاستخدام الأساسي
إنشاء وعد:
يتم استخدام كائن Promise
لتغليف العمليات غير المتزامنة۔ يتم إنشاء Promise
باستخدام new Promise(executor)
، ويتم تنفيذ العمليات غير المتزامنة داخله۔ تأخذ الدالة executor
وظيفتين كوسيطتين، هما resolve
وreject
۔
1const myPromise = new Promise<number>((resolve, reject) => {
2 // Perform asynchronous operations
3 const success = true; // This is just an example
4 if (success) {
5 resolve(42); // In case of success
6 } else {
7 reject('Failed'); // In case of failure
8 }
9});
استخدام وعد:
يتم معالجة Promise
الذي تم إنشاؤه باستخدام then()
و catch()
۔
1myPromise.then((value) => {
2 console.log(`Success: ${value}`); // Process the value passed with resolve
3}).catch((error) => {
4 console.error(`Error: ${error}`); // Handle the error passed with reject
5});
طريقة finally()
1const myPromise = new Promise<number>((resolve, reject) => {
2 // Perform asynchronous operations
3 const success = false; // This is just an example
4 if (success) {
5 resolve(42); // In case of success
6 } else {
7 reject('Failed'); // In case of failure
8 }
9});
10
11myPromise.then((value) => {
12 console.log(`Success: ${value}`); // Process the value passed with resolve
13}).catch((error) => {
14 console.error(`Error: ${error}`); // Handle the error passed with reject
15}).finally(() => {
16 console.log('The operation has completed');
17});
- تحدد طريقة
finally()
كودًا سيتم تنفيذه دائمًا بغض النظر عما إذا تم الوفاء بالـPromise
أو تم رفضه۔
تسلسل الوعود:
من خلال تسلسل then()
بعد then()
، يمكنك ربط عدة عمليات غير متزامنة بشكل متسلسل۔
1const myPromise = new Promise<number>((resolve, reject) => {
2 // Perform asynchronous operations
3 const success = true; // This is just an example
4 if (success) {
5 resolve(42); // In case of success
6 } else {
7 reject('Failed'); // In case of failure
8 }
9});
10
11myPromise
12 .then((value) => {
13 console.log(`Success: ${value}`);
14 return value + 1; // Pass the value to the next then
15 })
16 .then((newValue) => {
17 console.log(`New value: ${newValue}`);
18 })
19 .catch((error) => {
20 console.error(`Error: ${error}`);
21 });
async/await:
في TypeScript، يمكنك التعامل مع الوعود بشكل أكثر وضوحًا باستخدام async
/await
۔ داخل وظيفة async
، يمكنك استخدام الكلمة المفتاحية await
للانتظار حتى الحصول على نتيجة الوعد۔
1const myPromise = new Promise<number>((resolve, reject) => {
2 // Perform asynchronous operations
3 const success = true; // This is just an example
4 if (success) {
5 resolve(42); // In case of success
6 } else {
7 reject('Failed'); // In case of failure
8 }
9});
10
11async function asyncFunction() {
12 try {
13 const value = await myPromise;
14 console.log(`Success: ${value}`);
15 } catch (error) {
16 console.error(`Error: ${error}`);
17 }
18}
19
20asyncFunction();
أساليب الوعد
Promise.all()
تقوم 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 });
- يتم استدعاء
then()
فقط عندما يتم الوفاء بجميع الـPromises
۔ يتم استدعاءcatch()
إذا فشل حتى واحد منها۔
Promise.race()
تعيد Promise.race
نتيجة أول وعد يكتمل بين عدة وعود۔
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});
- كما في هذا المثال، يتم إرجاع نتيجة أول وعد يكتمل۔
Promise.allSettled()
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 });
- يتم استدعاء
then()
بمجرد انتهاء جميع الـPromises
(سواء تم الوفاء بها أو رفضها)۔ كل نتيجة تتضمن خاصيةstatus
('fulfilled'
أو'rejected'
)۔ الإخفاقات لا تؤثر على العمليات الأخرى۔
Promise.any()
Promise.any
تنتظر حتى يتم تنفيذ أول وعد وتعيده۔
1const promise1 = new Promise((resolve) => setTimeout(() => resolve("A ok"), 300));
2const promise2 = new Promise((_, reject) => setTimeout(() => reject("B fail"), 100));
3const promise3 = new Promise((resolve) => setTimeout(() => resolve("C ok"), 200));
4
5Promise.any([promise1, promise2, promise3])
6 .then(value => {
7 // Logs the first fulfilled value ("C ok")
8 console.log("first fulfilled:", value);
9 })
10 .catch(err => {
11 console.log("should not reach here in this example:", err);
12 });
- تعيد أول قيمة مُنفذة بين عدة وعود۔
الملخص
باستخدام TypeScript، يمكنك تحديد أنواع الوعود بشكل مناسب، مما يتيح لك كتابة برامج أكثر أمانًا من حيث الأنواع۔ يساعد ذلك في اكتشاف الأخطاء مبكرًا أثناء التطوير عن طريق تحديد نوع القيمة التي يعيدها الوعد مقدمًا۔
يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔