Promise Ù
Ø¹Ø§ÙØ¬Ø§Øª اÙÙ .then/.catch/.finally ØºÙØ± Ù
تزاÙ
ÙØ© دائÙ
ا
ØØªÙ Ø¹ÙØ¯Ù
ا ÙØªÙ
ØÙ promise عÙ٠اÙÙÙØ± Ø ÙØ¥Ù اÙÙÙØ¯ اÙÙ
ÙØ¬Ùد عÙÙ Ø§ÙØ£Ø³Ø·Ø± _ Ø£Ø¯ÙØ§Ù _ .then /.catch / .finally ستستÙ
ر ÙØ¨Ù تÙÙÙØ° ÙØ°Ù اÙÙ
Ø¹Ø§ÙØ¬Ø§Øª.
ÙÙØ§ عرض ØªÙØ¶ÙØÙ:
let promise = Promise.resolve();
promise.then(() => alert('promise done!'));
alert('code finished'); // this alert shows first
إذا ÙÙ
ت بتشغÙÙÙ, Ø³ØªÙØ§ØØ¸ code finished Ø£ÙÙØ§, Ø«Ù
بعد ذÙÙpromise done!.
ÙØ°Ø§ ØºØ±ÙØ¨ Ø ÙØ£Ù اÙpromise ÙØªÙ Ø¨Ø§ÙØªØ£ÙÙØ¯ Ù Ù Ø§ÙØ¨Ø¯Ø§ÙØ©.
Ù٠اذا ت٠تشغÙÙ â.thenâ Ø¨Ø¹Ø¯ ذÙÙØ ٠اذا ÙØØ¯Ø« ÙÙØ§Ø
Ø·Ø§Ø¨ÙØ± اÙÙ ÙØ§Ù Ø§ÙØµØºÙرة
Asynchronous tasks need proper management. For that, the ECMA standard specifies an internal queue PromiseJobs, more often referred to as the âmicrotask queueâ (V8 term).
Ù٠ا Ù٠٠ذÙÙØ± ÙÙ [اÙÙ ÙØ§ØµÙات] (https://tc39.github.io/ecma262/#sec-jobs-and-job-queues):
- ÙØ§Ø¦Ù Ø© Ø§ÙØ§Ùتظار Ù٠أÙ٠٠ا ÙØ®Ø±Ø¬ Ø£ÙÙØ§Ù: ÙØªÙ تÙÙÙØ° اÙÙ ÙØ§Ù اÙÙ ØØ¯Ø¯Ø© Ø£ÙÙØ§Ù.
- ÙØ¨Ø¯Ø£ تÙÙÙØ° اÙÙ ÙÙ Ø© ÙÙØ· ÙÙ ØØ§ÙØ© عد٠تشغÙÙ Ø£Ù Ø´ÙØ¡ آخر.
Ø£Ù Ø Ø¨Ø¨Ø³Ø§Ø·Ø© Ø Ø¹ÙØ¯Ù ا ÙÙÙ٠اÙÙØ¹Ø¯ Ø¬Ø§ÙØ²Ùا Ø ÙØªÙ ÙØ¶Ø¹ Ù Ø¹Ø§ÙØ¬Ø§Øª âthen / catch / ÙØ£Ø®Ùراâ ÙÙ ÙØ§Ø¦Ù Ø© Ø§ÙØ§Ùتظار Ø ÙÙ ÙØªÙ إعدا٠Ù٠بعد. Ø¹ÙØ¯Ù ا ÙØµØ¨Ø Ù ØØ±Ù JavaScript خاÙÙÙØ§ Ù Ù Ø§ÙØªØ¹ÙÙ٠ات Ø§ÙØ¨Ø±Ù Ø¬ÙØ© Ø§ÙØØ§ÙÙØ© Ø ÙØ¥ÙÙ ÙØ£Ø®Ø° Ù ÙÙ Ø© Ù Ù ÙØ§Ø¦Ù Ø© Ø§ÙØ§Ùتظار ÙÙÙÙØ°Ùا.
ÙØ°Ø§ ÙÙ Ø§ÙØ³Ø¨Ø¨ ÙÙ Ø£Ù âØ§ÙØ±Ù
ز Ø§ÙØªÙÙâ Ù٠اÙÙ
Ø«Ø§Ù Ø£Ø¹ÙØ§Ù ÙØ¸Ùر Ø£ÙÙØ§Ù.
ت٠ر Ù Ø¹Ø§ÙØ¬Ø§Øª اÙÙØ¹Ø¯ Ø¯Ø§Ø¦Ù ÙØ§ Ù Ù Ø®ÙØ§Ù ÙØ§Ø¦Ù Ø© Ø§ÙØ§Ùتظار Ø§ÙØ¯Ø§Ø®ÙÙØ© ÙØ°Ù.
إذا ÙØ§Ùت ÙÙØ§Ù Ø³ÙØ³ÙØ© ØªØØªÙ٠عÙ٠عدة â.then / catch / Ø£Ø®ÙØ±Ø§â Ø ÙØ³Ùت٠تÙÙÙØ° ÙÙ ÙØ§ØØ¯ Ù ÙÙØ§ بشÙÙ ØºÙØ± ٠تزا٠Ù. أ٠أÙÙ ÙØªÙ ÙØ¶Ø¹Ù ÙÙ ÙØ§Ø¦Ù Ø© Ø§ÙØ§Ùتظار Ø£ÙÙØ§Ù Ø Ø«Ù ÙØªÙ تÙÙÙØ°Ù Ø¹ÙØ¯ Ø§ÙØªÙ Ø§Ù Ø§ÙØ±Ù ز Ø§ÙØØ§ÙÙ ÙØ§ÙØ§ÙØªÙاء Ù Ù Ù Ø¹Ø§ÙØ¬Ø§Øª ÙØ§Ø¦Ù Ø© Ø§ÙØ§Ùتظار Ø§ÙØ³Ø§Ø¨ÙØ©.
** ٠اذا ÙÙ ÙØ§Ù Ø§ÙØ£Ù ر ÙÙÙ ÙØ§Ø ÙÙÙ ÙÙ ÙÙÙØ§ Ø£Ù ÙØ¬Ø¹Ù âØ§ÙØ´Ùرة Ù ÙØªÙÙØ©â تع٠٠بعد âØ§ÙÙØ¹Ø¯âØ **
سÙÙ Ø Ù Ø§ عÙÙ٠سÙÙ ÙØ¶Ø¹Ùا ÙÙ ÙØ§Ø¦Ù Ø© Ø§ÙØ§Ùتظار باستخدا٠".then`:
Promise.resolve()
.then(() => alert('promise done!'))
.then(() => alert('code finished'));
Ø§ÙØ¢Ù Ø§ÙØ£Ù ر Ù٠ا ÙÙ Ù ÙØµÙد.
Ø±ÙØ¶ ØºÙØ± Ù Ø¹Ø§ÙØ¬
ÙÙ ØªØªØ°ÙØ± ØØ¯Ø« unhandledrejection Ù
٠اÙÙ
ÙØ§ÙØ© <info: promo-error-handling>Ø
Ø§ÙØ¢Ù ÙÙ ÙÙÙØ§ Ø£Ù ÙØ±Ù Ø¨Ø§ÙØ¶Ø¨Ø· ÙÙÙ ØªÙØªØ´Ù Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ÙØ¬Ùد Ø±ÙØ¶ ØºÙØ± Ù Ø¹Ø§ÙØ¬.
** ÙØØ¯Ø« âØ±ÙØ¶ ØºÙØ± Ù Ø¹Ø§ÙØ¬â Ø¹ÙØ¯Ù ا ÙØ§ ØªØªÙ Ù Ø¹Ø§ÙØ¬Ø© خطأ اÙÙØ¹Ø¯ ÙÙ ÙÙØ§ÙØ© ÙØ§Ø¦Ù Ø© اÙÙ ÙØ§Ù Ø§ÙØ¯ÙÙÙØ©. **
Ø¹Ø§Ø¯Ø©Ù Ø Ø¥Ø°Ø§ تÙÙØ¹Ùا خطأ Ø ÙØ¥ÙÙØ§ ÙØ¶ÙÙ â.catchâ Ø¥ÙÙ Ø³ÙØ³ÙØ© اÙÙØ¹Ùد ÙÙØªØ¹Ø§Ù ٠٠عÙ:
let promise = Promise.reject(new Error("Promise Failed!"));
promise.catch(err => alert('caught'));
// doesn't run: error handled
window.addEventListener('unhandledrejection', event => alert(event.reason));
ÙÙÙ٠إذا ÙØ³ÙÙØ§ Ø¥Ø¶Ø§ÙØ© â.catchâ Ø ÙØ¹Ùد٠ا ØªØµØ¨Ø ÙØ§Ø¦Ù Ø© Ø§ÙØªØ¸Ø§Ø± اÙÙ ÙØ§Ù Ø§ÙØ¯ÙÙÙØ© ÙØ§Ø±ØºØ© Ø ÙÙÙ٠اÙÙ ØØ±Ù بتشغÙÙ Ø§ÙØØ¯Ø«:
let promise = Promise.reject(new Error('Promise Failed!'));
// Promise Failed!
window.addEventListener('unhandledrejection', (event) => alert(event.reason));
٠اذا Ù٠تعا٠ÙÙØ§ ٠ع Ø§ÙØ®Ø·Ø£ ÙØ§ØÙÙØ§Ø Ù Ø«ÙÙ:
let promise = Promise.reject(new Error("Promise Failed!"));
setTimeout(() => promise.catch(err => alert('caught')), 1000);
// Error: Promise Failed!
window.addEventListener('unhandledrejection', event => alert(event.reason));
Ø§ÙØ¢Ù Ø Ø¥Ø°Ø§ ÙÙ ÙØ§ بتشغÙÙÙ Ø ÙØ³Ùر٠âÙØ´Ù اÙÙØ¹Ø¯!â Ø£ÙÙØ§Ù Ø«Ù âØªÙ Ø§ÙØ¥Ù ساÙâ.
إذا ÙÙ ÙÙÙ ÙØ¹Ø±Ù Ø¹Ù ÙØ§Ø¦Ù Ø© Ø§ÙØªØ¸Ø§Ø± اÙÙ ÙØ§Ù Ø§ÙØµØºÙرة Ø ÙÙÙ ÙÙÙØ§ Ø£Ù ÙØªØ³Ø§Ø¡Ù: âÙ٠اذا ت٠تشغÙÙ Ù Ø¹Ø§ÙØ¬â Ø¹Ø¯Ù Ø§ÙØªØ¹Ø§Ù ٠٠ع Ø±ÙØ¶ âØ ÙÙØ¯ أ٠سÙÙØ§ Ø¨Ø§ÙØ®Ø·Ø£ ÙÙ Ø¹Ø§ÙØ¬ØªÙ!â
ÙÙÙÙÙØ§ ÙÙÙÙ Ø§ÙØ¢Ù Ø£Ù âØ±ÙØ¶Ùا ØºÙØ± ٠عاÙÙØ¬â ÙØªÙ Ø¥ÙØ´Ø§Ø¤Ù Ø¹ÙØ¯ Ø§ÙØªÙ Ø§Ù ÙØ§Ø¦Ù Ø© Ø§ÙØªØ¸Ø§Ø± اÙÙ ÙØ§Ù اÙ٠صغرة: ÙÙÙ٠اÙÙ ØØ±Ù Ø¨ÙØØµ اÙÙØ¹Ùد Ø ÙØ¥Ø°Ø§ ÙØ§Ù Ø£Ù Ù ÙÙØ§ ÙÙ ØØ§ÙØ© â٠رÙÙØ¶Ø©â Ø ÙØªÙ تشغÙÙ Ø§ÙØØ¯Ø«.
Ù٠اÙÙ
Ø«Ø§Ù Ø£Ø¹ÙØ§Ù Ø ÙØªÙ
تشغÙÙ .catch Ø¨ÙØ§Ø³Ø·Ø©setTimeout Ø£ÙØ¶Ùا. ÙÙÙÙÙ ÙÙØ¹Ù ذÙÙ ÙØ§ØÙÙØ§ Ø Ø¨Ø¹Ø¯ ØØ¯ÙØ« âØ±ÙØ¶ ØºÙØ± Ù
عاÙÙØ¬â باÙÙØ¹Ù Ø ÙØ°ÙÙ ÙØ§ ÙØºÙر Ø£Ù Ø´ÙØ¡.
Ù ÙØ®Øµ
Promise handling is always asynchronous, as all promise actions pass through the internal âpromise jobsâ queue, also called âmicrotask queueâ (V8 term).
ÙØ°ÙÙ ÙØªÙ
دائÙ
ÙØ§ استدعاء Ù
Ø¹Ø§ÙØ¬Ø§Øª .then / catch / Ø£Ø®ÙØ±Ø§ بعد Ø§ÙØªÙاء اÙÙÙØ¯ Ø§ÙØØ§ÙÙ.
إذا Ø§ØØªØ¬Ùا Ø¥Ù٠ض٠ا٠تÙÙÙØ° جزء Ù Ù Ø§ÙØ±Ù ز بعد â.then / catch / Ø£Ø®ÙØ±Ø§â Ø ÙÙ ÙÙÙØ§ Ø¥Ø¶Ø§ÙØªÙ Ø¥ÙÙ Ù ÙØ§ÙÙ Ø© â.thenâ Ø§ÙÙ ØªØ³ÙØ³ÙØ©.
ÙÙ Ù Ø¹Ø¸Ù Ù ØØ±Ùات Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت Ø Ø¨Ù Ø§ Ù٠ذÙ٠اÙÙ ØªØµÙØØ§Øª Ù Node.js Ø ÙØ±ØªØ¨Ø· Ù ÙÙÙ٠اÙÙ ÙØ§Ù Ø§ÙØ¯ÙÙÙØ© Ø§Ø±ØªØ¨Ø§Ø·ÙØ§ ÙØ«ÙÙÙØ§ ب٠âØÙÙØ© Ø§ÙØ£ØØ¯Ø§Ø«â Ù âØ§ÙÙ ÙØ§Ù اÙÙØ¨Ùرةâ. ÙØ¸Ø±Ùا ÙØ£Ù ÙØ°Ù ÙÙØ³Øª ÙÙØ§ Ø¹ÙØ§ÙØ© ٠باشرة باÙÙØ¹Ùد Ø ÙÙØ¯ ØªÙ ØªÙØ§ÙÙÙØ§ Ù٠جزء آخر Ù Ù Ø§ÙØ¨Ø±Ùا٠ج Ø§ÙØªØ¹ÙÙÙ Ù Ø Ù٠اÙÙ ÙØ§ÙØ© <info: event-loop>.
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)