ÙÙØ¯ÙØ±ÙØ§Û (handler) پراÙ
ÛØ³ .then/.catch/.finally ÙÙ
ÙØ§Ø±Ù ÙØ§ÙÙ
گاÙ
ÙØ³ØªÙد.
ØØªÛ زÙ
اÙÛ Ú©Ù ÛÚ© پراÙ
ÛØ³ در Ø¢Ù ÙØ§ØØ¯ ب٠سر Ø§ÙØ¬Ø§Ù
Ø±Ø³ÛØ¯Ù, کد ÙØ§ÛÛ Ú©Ù Ø¯Ø± Ø®Ø·ÙØ· Ø²ÛØ±ÛÙ .then/.catch/.finally ÙØ³ØªÙد ÙÙÙØ² Ù¾ÛØ´ از اÛÙ ÙÙØ¯ÙØ±ÙØ§ (handler) اجرا Ù
Û Ø´ÙÙØ¯.
ÛÚ© ÙÙ ÙÙÙ:
let promise = Promise.resolve();
promise.then(() => alert("promise done!"));
alert("code finished"); // ابتدا اÛÙ ÙØ´Ø¯Ø§Ø± ÙÙ
Ø§ÛØ§Ù Ù
Û Ø´ÙØ¯
اگر اÛ٠کد را اجرا Ú©ÙÛØ¯, عبارت code finished را در ابتدا ٠سپس promise done! را Ù
ÛØ¨ÛÙÛØ¯.
اÛÙ Ø¹Ø¬ÛØ¨ است, Ø²ÛØ±Ø§ Ù¾Ø±Ø§Ù ÛØ³ ÙØ·Ø¹Ø§ از Ù¾ÛØ´ Ø¨Ù Ø§ÙØ¬Ø§Ù Ø±Ø³ÛØ¯Ù است.
ÚØ±Ø§ .then بعدتر اجرا Ø´Ø¯Ø Ú٠رخ Ù
ÛØ¯ÙدØ
ص٠Microtasks
کار ÙØ§Û ÙØ§ÙÙ
گاÙ
ÙÛØ§Ø²Ù
ÙØ¯ Ù
Ø¯ÛØ±Ûت درست ÙØ³ØªÙد. ب٠ÙÙ
ÛÙ Ø³Ø¨Ø¨Ø Ø§Ø³ØªØ§ÙØ¯Ø§Ø±Ø¯ ECMA ÛÚ© ص٠داخÙÛ Ø¨Ù ÙØ§Ù
PromiseJobs Ù
شخص Ù
ÛÚ©ÙØ¯ Ú©Ù Ø¨ÛØ´ØªØ± با ÙØ§Ù
âmicrotask queueâ Ø§Ø² Ø¢Ù ÛØ§Ø¯ Ù
Û Ø´ÙØ¯ (Ø§ØµØ·ÙØ§Ø V8).
ÙÙ Ø§ÙØ·Ùر ک٠در Ø®ØµÙØµÛات Ø²Ø¨Ø§Ù ÛØ§Ø¯ شدÙ:
- ص٠first-in-first-out است: Ú©Ø§Ø±ÙØ§ÛÛ Ú©Ù ÙØ®Ø³Øª ÙØ§Ø±Ø¯ ØµÙ Ø´Ø¯Ù Ø§ÙØ¯ ÙØ®Ø³Øª اجرا Ù Û Ø´ÙÙØ¯.
- Ø§Ø¬Ø±Ø§Û ÛÚ© کار تÙÙØ§ ز٠اÙÛ Ø´Ø±ÙØ¹ Ù Û Ø´ÙØ¯ Ú©Ù ÚÛØ² دÛÚ¯Ø±Û Ø¯Ø± ØØ§Ù اجرا ÙØ¨Ø§Ø´Ø¯.
ÛØ§Ø ب٠عبارت Ø³Ø§Ø¯Ù ØªØ±Ø Ø²Ù
اÙÛ Ú©Ù ÛÚ© پراÙ
ÛØ³ Ø¢Ù
Ø§Ø¯Ù Ø§Ø³ØªØ Ù
Ø¯ÛØ± ÙØ§Û .then/catch/finally آ٠درÙÙ ØµÙ ÙØ±Ø§Ø± داد٠Ù
Û Ø´ÙÙØ¯Ø Ø¢ÙÙØ§ ÙÙÙØ² اجرا ÙØ´Ø¯Ù Ø§ÙØ¯. زÙ
اÙÛ Ú©Ù Ù
ÙØªÙر Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت از کد ÙØ¹ÙÛ Ø±ÙØ§ Ù
Û Ø´ÙØ¯Ø ÛÚ© کار (تسک) از ص٠Ù
ÛÚ¯ÛØ±Ø¯ ٠آ٠را اجرا Ù
ÛÚ©ÙØ¯.
ب٠ÙÙ Û٠دÙÛ٠عبارت âcode finishedâ Ø¯Ø± ÙÙ ÙÙÙ Ø¨Ø§ÙØ§ ÙØ®Ø³Øª ÙÙ Ø§ÛØ§Ù Ù Û Ø´ÙØ¯.
ÙÙØ¯ÙØ±ÙØ§Û (handler) Ù¾Ø±Ø§Ù ÛØ³ ÙÙ ÙØ§Ø±Ù از درÙ٠اÛ٠ص٠داخÙÛ Ù Û Ú¯Ø°Ø±ÙØ¯.
اگر Ø²ÙØ¬ÛØ±Ù Ø§Û Ø¨Ø§ ÚÙØ¯ÛÙ .then/catch/finally Ø¨Ø§Ø´Ø¯Ø Ø¢ÙÚ¯Ø§Ù ÙØ± ÛÚ© از Ø¢ÙÙØ§ Ø¨Ù ØµÙØ±Øª ÙØ§ÙÙ
گاÙ
اجرا Ù
Û Ø´ÙØ¯. Ø¨Ø¯Ø§Ù ØµÙØ±Øª Ú©ÙØ ابتدا ÙØ§Ø±Ø¯ ص٠Ù
Û Ø´ÙØ¯Ø سپس زÙ
اÙÛ Ú©Ù Ú©Ø¯ ÙØ¹ÙÛ ØªÙ
اÙ
شد٠٠ÙÙØ¯ÙØ±ÙØ§Û (handler) Ù¾ÛØ´ÛÙ ØµÙ Ø´Ø¯Ù Ø¨Ù Ù¾Ø§ÛØ§Ù Ø±Ø³ÛØ¯Ù Ø§ÙØ¯Ø اجرا Ù
Û Ø´ÙØ¯.
اگر ØªØ±ØªÛØ¨ Ø¨Ø±Ø§Û Ù
ا اÙÙ
ÛØª داشت ÚÙ? ÚÚ¯ÙÙÙ Ù
Û ØªÙØ§ÙÛÙ
code finished را Ù¾ÛØ´ از promise done ÙÙ
Ø§ÛØ§Ù Ú©ÙÛÙ
Ø
Ø¨Ù Ø³Ø§Ø¯Ú¯ÛØ ÙÙØ· با Ø§Ø³ØªÙØ§Ø¯Ù از .then درÙÙ ØµÙ ÙØ±Ø§Ø±Ø´ بدÙ:
Promise.resolve()
.then(() => alert("promise done!"))
.then(() => alert("code finished"));
ØØ§Ùا ØªØ±ØªÛØ¨ در ÙØ¸Ø± Ú¯Ø±ÙØªÙ شدÙ.
rejection Ù Ø¯ÛØ±Ûت ÙØ´Ø¯Ù
اÛÙÙØª unhandledrejection را از Ù
ÙØ§ÙÙ Ù
Ø¯ÛØ±Ûت Ø§Ø±ÙØ±Ùا با promiseÙØ§ Ø¨Ù ÛØ§Ø¯ Ø¯Ø§Ø±ÛØ¯Ø
ØØ§Ù Ù ÛØªÙاÙÛÙ Ø¨Ù Ø¯ÙØª ببÛÙÛÙ Ú©Ù Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت ÚÚ¯ÙÙÙ Ù¾Û Ù ÛØ¨Ø±Ø¯ ک٠رد Ø´Ø¯Ù Ù Ø¯ÛØ±Ûت ÙØ´Ø¯Ù Ø§Û Ù¾ÛØ´ آ٠دÙ.
ÛÚ© ârejection Ù Ø¯ÛØ±Ûت ÙØ´Ø¯Ùâ Ø²Ù اÙÛ Ù¾ÛØ´ Ù Û Ø¢ÛØ¯ Ú©Ù ÛÚ© Ø®Ø·Ø§Û Ù¾Ø±Ø§Ù ÛØ³ در Ù¾Ø§ÛØ§Ù ص٠خرد٠کار Ù Ø¯ÛØ±Ûت ÙØ´Ø¯Ù باشد.
Ù
عÙ
ÙÙØ§Ø اگر Ù
ÙØªØ¸Ø± خطاÛÛ ÙØ³ØªÛÙ
Ø .catch را Ø¨Ù Ø²ÙØ¬Ûر٠پراÙ
ÛØ³ Ù
Û Ø§ÙØ²Ø§ÛÛÙ
تا آ٠را Ù
Ø¯ÛØ±Ûت Ú©ÙØ¯:
let promise = Promise.reject(new Error("Promise Failed!"));
promise.catch(err => alert('caught'));
// اجرا ÙÙ
Û Ø´ÙØ¯: خطا Ù
Ø¯ÛØ±Ûت شد
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));
ØØ§ÙØ Ø§Ú¯Ø± Ø§Ø¬Ø±Ø§ÛØ´ Ú©ÙÛÙ
Ø Ø¹Ø¨Ø§Ø±Øª Promise Failed! را ÙØ®Ø³Øª ٠سپس عبارت caught را Ù
Ø´Ø§ÙØ¯Ù Ø®ÙØ§ÙÛÙ
کرد.
اگر Ù
ا دربار٠ص٠Microtasks ÙÙ
ÛØ¯Ø§ÙستÛÙ
Ø Ù
Û ØªÙØ§ÙستÛÙ
Ø´Ú¯ÙØª زد٠شÙÛÙ
: âÚØ±Ø§ ÙÙØ¯Ùر unhandledrejection اجرا Ø´Ø¯Ø Ù
ا ÛÙÛÙØ§ خطا را Ú¯Ø±ÙØªÛÙ
Ù Ù
Ø¯ÛØ±Ûت کردÛÙ
!â
اÙ
ا ØØ§Ù Ù
ØªÙØ¬Ù Ù
Û Ø´ÙÛÙ
Ú©Ù unhandledrejection زÙ
اÙÛ Ø§ÛØ¬Ø§Ø¯ Ù
Û Ø´ÙØ¯ Ú©Ù Microtask کار تÙ
اÙ
شدÙ: Ù
ÙØªÙر Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت پراÙ
ÛØ³ ÙØ§ را Ø¨Ø±Ø±Ø³Û Ù
ÛÚ©ÙØ¯ ÙØ اگر ÙØ± ÛÚ© از Ø¢ÙÙØ§ در ÙØ¶Ø¹Ûت ârejectedâ Ø¨Ø§Ø´Ø¯Ø Ø¢Ùگا٠اÛÙÙØª ÙØ±Ø§Ø®ÙاÙÛ Ù
Û Ø´ÙØ¯.
در ÙÙ
ÙÙÙ Ø¨Ø§ÙØ§Ø .catch Ø§ÙØ²ÙØ¯Ù Ø´Ø¯Ù ØªÙØ³Ø· setTimeout ÙÙ
ÙØ±Ø§Ø®ÙاÙÛ Ù
Û Ø´ÙØ¯. اÙ
ا بعدتر ÙØ±Ø§Ø®ÙاÙÛ Ù
Û Ø´ÙØ¯Ø پس از اÛÙک٠دÛگر unhandledrejection رخ Ø¯Ø§Ø¯ÙØ پس ÚÛØ²Û را تغÛÛØ± ÙÙ
ÛØ¯Ùد.
ÚÚ©ÛØ¯Ù
Ù Ø¯ÛØ±Ûت Ù¾Ø±Ø§Ù ÛØ³ ÙÙ ÙØ§Ø±Ù ÙØ§ÙÙ Ú¯Ø§Ù Ø§Ø³ØªØ ÙÙ Ø§ÙØ·Ùر ک٠ت٠ا٠ع٠ÙÛØ§Øª Ù¾Ø±Ø§Ù ÛØ³ از درÙ٠ص٠داخÙÛ âpromise jobsâ Ù Û Ú¯Ø°Ø±ÙØ¯Ø ÙÙ ÚÙÛ٠با عÙÙØ§Ù âmicrotask queueâ Ø§Ø² Ø¢Ù ÛØ§Ø¯ Ù Û Ø´ÙØ¯ (Ø§ØµØ·ÙØ§Ø V8).
پس ÙÙØ¯Ùر ÙØ§Û .then/catch/finally ÙÙ
ÙØ§Ø±Ù پس از Ø¨Ù Ù¾Ø§ÛØ§Ù Ø±Ø³ÛØ¯Ù کد ÙØ¹ÙÛ ÙØ±Ø§Ø®ÙاÙÛ Ù
Û Ø´ÙÙØ¯.
اگر ÙÛØ§Ø² دارÛÙ
ک٠تضÙ
ÛÙ Ú©ÙÛÙ
ÛÚ© تک٠کد پس از .then/catch/finally اجرا Ù
Û Ø´ÙØ¯Ø Ù
Û ØªÙØ§ÙÛÙ
ب٠ÛÚ© ÙØ±Ø§Ø®ÙاÙÛ Ø²ÙØ¬ÛØ±Ù Ø§Û .then آ٠را Ø¨ÛØ§ÙزاÛÛÙ
.
در Ø¨ÛØ´ØªØ± Ù ÙØªÙر ÙØ§Û Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±ÛÙ¾ØªØ Ø´Ø§Ù Ù Ù Ø±ÙØ±Ú¯Ø± ÙØ§ Ù Node.jsØ Ù ÙÙÙÙ Microtasks Ø¨Ù Ø¯ÙØª با âevent loopâ Ù âmacrotasksâ Ø¯Ø± Ù٠تÙÛØ¯Ù شدÙ. از Ø¢ÙØ¬Ø§ÛÛ Ú©Ù Ø§Û٠د٠رابط٠٠ستÙÛÙ Û Ø¨Ø§ Ù¾Ø±Ø§Ù ÛØ³ ÙØ§ ÙØ¯Ø§Ø±ÙØ¯Ø Ø¯Ø± بخش دÛÚ¯Ø±Û Ø§Ø² اÛÙ Ø¯ÙØ±Ù ب٠آÙÙØ§ Ù¾Ø±Ø¯Ø§Ø®ØªÙ Ø´Ø¯ÙØ در Ù ÙØ§ÙÙ Event loop: microtasks Ù macrotasks.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)