Ø§Ø¬Ø±Ø§Û Browser JavaScript execution flowØ Ù ÙÙ ÚÙÛÙ Node.jsØ Ø¨Ø± اساس ÛÚ© event loop است.
درک ÙØÙ٠ع٠Ùکرد ØÙÙ٠رÙÛØ¯Ø§Ø¯ Ø¨Ø±Ø§Û Ø¨ÙÛÙÙ Ø³Ø§Ø²Û ÙØ§ ٠گاÙÛ Ø§ÙÙØ§Øª Ø¨Ø±Ø§Û Ù Ø¹Ù Ø§Ø±Û Ù ÙØ§Ø³Ø¨ Ù Ù٠است.
در اÛÙ ÙØµÙ ابتدا Ø¬Ø²Ø¦ÛØ§Øª ÙØ¸Ø±Û در Ù ÙØ±Ø¯ ÚÚ¯ÙÙÚ¯Û Ú©Ø§Ø±Ú©Ø±Ø¯ ÚÛØ²Ùا را Ù¾ÙØ´Ø´ Ù Û Ø¯ÙÛ٠٠سپس Ú©Ø§Ø±Ø¨Ø±Ø¯ÙØ§Û ع٠ÙÛ Ø¢Ù Ø¯Ø§ÙØ´ را Ù Ø´Ø§ÙØ¯Ù Ù Û Ú©ÙÛÙ .
Event Loop
Ù ÙÙÙÙ event loop Ø¨Ø³ÛØ§Ø± ساد٠است. ÛÚ© ØÙÙÙ Ø¨Û Ù¾Ø§ÛØ§Ù ÙØ¬Ùد دارد ک٠در Ø¢Ù Ù ÙØªÙر Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù ÙØªØ¸Ø± ÙØ¸Ø§ÛÙ Ù Û Ù Ø§ÙØ¯Ø Ø¢ÙÙØ§ را اجرا Ù Û Ú©ÙØ¯ ٠سپس Ø¨Ù Ø®ÙØ§Ø¨ Ù Û Ø±ÙØ¯ Ù Ù ÙØªØ¸Ø± Ú©Ø§Ø±ÙØ§Û Ø¨ÛØ´ØªØ± است.
اÙÚ¯ÙØ±Ûت٠کÙÛ Ù ÙØªÙر:
- در ØØ§ÙÛ Ú©Ù ÙØ¸Ø§ÛÙ ÙØ¬Ùد دارد:
- Ø¢ÙÙØ§ را با ÙØ¯ÛÙ Û ØªØ±Û٠کار Ø´Ø±ÙØ¹ Ú©ÙÛØ¯.
- Ø¨Ø®ÙØ§Ø¨Ûد تا ز٠اÙÛ Ú©Ù ÛÚ© کار Ø¸Ø§ÙØ± Ø´ÙØ¯Ø سپس ب٠1 برÙÛØ¯.
ÛÙ ÛÚ© Ø±Ø³Ù Û Ø³Ø§Ø²Û Ø¨Ø±Ø§Û ÚÛØ²Û است Ú©Ù ÙÙÚ¯Ø§Ù Ù Ø±ÙØ± ÛÚ© ØµÙØÙ Ù Û Ø¨ÛÙÛÙ . Ù ÙØªÙر Ø¬Ø§ÙØ§ اسکرÛپت در اکثر Ù ÙØ§Ùع ÙÛÚ Ú©Ø§Ø±Û Ø§ÙØ¬Ø§Ù ÙÙ Û Ø¯ÙØ¯Ø ÙÙØ· در ØµÙØ±ØªÛ اجرا Ù Û Ø´ÙØ¯ Ú©Ù ÛÚ© اسکرÛپت/ÙÙØ¯Ùر/رÙÛØ¯Ø§Ø¯ ÙØ¹Ø§Ù Ø´ÙØ¯.
ÙÙ ÙÙÙ ÙØ§ÛÛ Ø§Ø² ÙØ¸Ø§ÛÙ:
- ÙÙØªÛ ÛÚ© اسکرÛپت خارجÛ
<script src="...">Ø¨Ø§Ø±Ú¯ÛØ±Û Ù Û Ø´ÙØ¯Ø ÙØ¸ÛÙÙ Ø§Ø¬Ø±Ø§Û Ø¢Ù Ø§Ø³Øª. - ÙÙگاÙ
Û Ú©Ù ÛÚ© کاربر Ù
Ø§ÙØ³ Ø®ÙØ¯ را ØØ±Ú©Øª Ù
Û Ø¯ÙØ¯Ø ÙØ¸ÛÙ٠ارسا٠رÙÛØ¯Ø§Ø¯
mousemoveÙ Ø§Ø¬Ø±Ø§Û Ú©ÙØªØ±Ù Ú©ÙÙØ¯Ù ÙØ§ است. - ÙÙگاÙ
Û Ú©Ù Ø²Ù
ا٠تعÛÛ٠شد٠براÛ
setTimeoutØ¨Ø±ÙØ§Ù Ù Ø±ÛØ²Û Ø´Ø¯Ù Ø§Ø³ØªØ Ú©Ø§Ø± اÛ٠است ک٠ت٠اس ٠جدد آ٠را اجرا Ú©ÙÛØ¯. - â¦ Ù ØºÛØ±Ù.
ÙØ¸Ø§ÛÙ ØªÙØ¸ÛÙ Ù Û Ø´ÙÙØ¯ â Ù ÙØªÙر Ø¢ÙÙØ§ را Ù Ø¯ÛØ±Ûت Ù Û Ú©ÙØ¯ â Ø³Ù¾Ø³ Ù ÙØªØ¸Ø± Ú©Ø§Ø±ÙØ§Û Ø¨ÛØ´ØªØ±Û Ù Û Ù Ø§ÙØ¯ (در ØØ§Ùت Ø®ÙØ§Ø¨ ٠٠صر٠CPU ÙØ²Ø¯ÛÚ© Ø¨Ù ØµÙØ±).
٠٠ک٠است ز٠اÙÛ Ø§ØªÙØ§Ù بÛÙØªØ¯ Ú©Ù ÛÚ© کار در ØØ§ÙÛ Ú©Ù Ù ÙØªÙر ٠شغÙ٠است Ø¨ÛØ§ÛØ¯Ø Ø³Ù¾Ø³ در ÙÙØ¨Øª ÙØ±Ø§Ø± Ú¯ÛØ±Ø¯.
ÙØ¸Ø§ÛÙ ÛÚ© ص٠تشکÛÙ Ù Û Ø¯ÙÙØ¯ Ú©Ù Ø§ØµØ·ÙØ§ØØ§Ù ب٠آ٠âmacrotask queueâ (v8 term) Ù Û Ú¯ÙÛÙØ¯:
ب٠عÙÙØ§Ù Ù
Ø«Ø§ÙØ در ØØ§ÙÛ Ú©Ù Ù
ÙØªÙر Ù
شغÙÙ Ø§Ø¬Ø±Ø§Û ÛÚ© script Ø§Ø³ØªØ ÛÚ© کاربر Ù
Ù
ک٠است Ù
Ø§ÙØ³ Ø®ÙØ¯ را ØØ±Ú©Øª Ø¯ÙØ¯ ٠باعث mousemove Ø´ÙØ¯Ø Ù setTimeout Ù
Ù
ک٠است ب٠دÙÛÙ ÙØ¬Ùد داشت٠باشد Ù ØºÛØ±ÙØ Ø§ÛÙ ÙØ¸Ø§ÛÙ ÛÚ© ص٠تشکÛÙ Ù
Û Ø¯ÙÙØ¯Ø ÙÙ
Ø§ÙØ·Ùر ک٠در تصÙÛØ± Ø¨Ø§ÙØ§ ÙØ´Ø§Ù داد٠شد٠است.
ÙØ¸Ø§Û٠از ص٠بر اساس âfirst come â first servedâ پردازش Ù
Û Ø´ÙØ¯. ÙÙØªÛ Ù
Ø±ÙØ±Ú¯Ø± Ù
ÙØªÙر با script تÙ
اÙ
Ø´Ø¯Ø Ø±ÙÛØ¯Ø§Ø¯ mousemove ٠سپس setTimeoutÙ ØºÛØ±Ù را Ú©ÙØªØ±Ù Ù
ÛâÚ©ÙØ¯.
تا اÛÙØ¬Ø§Ø Ú©Ø§Ù ÙØ§ Ø³Ø§Ø¯ÙØ درست استØ
Ø¯Ù Ø¬Ø²Ø¦ÛØ§Øª دÛگر:
- Ø±ÙØ¯Ø± ÙØ±Ú¯Ø² Ø§ØªÙØ§Ù ÙÙ Û Ø§ÙØªØ¯ در ØØ§ÙÛ Ú©Ù Ù ÙØªÙر ÛÚ© کار را اجرا Ù Û Ú©ÙØ¯. Ù ÙÙ ÙÛØ³Øª ک٠کار Ø²Ù Ø§Ù Ø²ÛØ§Ø¯Û ببرد. تغÛÛØ±Ø§Øª در DOM ÙÙØ· پس از تک٠Û٠کار Ø§ÙØ¬Ø§Ù Ù Û Ø´ÙØ¯.
- اگر ÛÚ© کار Ø¨ÛØ´ از ØØ¯ Ø·ÙÙØ§ÙÛ Ø´ÙØ¯Ø Ù Ø±ÙØ±Ú¯Ø± ÙÙ Û ØªÙØ§Ùد Ú©Ø§Ø±ÙØ§Û دÛÚ¯Ø±Û Ù Ø§ÙÙØ¯ پردازش رÙÛØ¯Ø§Ø¯ÙØ§Û Ú©Ø§Ø±Ø¨Ø± را Ø§ÙØ¬Ø§Ù Ø¯ÙØ¯. Ø¨ÙØ§Ø¨Ø±Ø§Û٠پس از Ù Ø¯ØªÛØ ÙØ´Ø¯Ø§Ø±Û ٠اÙÙØ¯ âPage Unresponsiveâ Ø±Ø§ Ù Ø·Ø±Ø Ù ÛâÚ©ÙØ¯ Ú©Ù ÙØ´Ø§Ù Ù ÛâØ¯ÙØ¯ کار با Ú©Ù ØµÙØÙ Ø§Ø² بÛÙ Ù ÛâØ±ÙØ¯. اÛ٠ز٠اÙÛ Ø§ØªÙØ§Ù Ù Û Ø§ÙØªØ¯ Ú©Ù Ù ØØ§Ø³Ø¨Ø§Øª Ù¾ÛÚÛØ¯Ù Ø²ÛØ§Ø¯Û ÙØ¬Ùد داشت٠باشد ÛØ§ ÛÚ© Ø®Ø·Ø§Û Ø¨Ø±ÙØ§Ù Ù ÙÙÛØ³Û Ù ÙØ¬Ø± ب٠ÛÚ© ØÙÙÙ Ø¨Û ÙÙØ§Ûت Ø´ÙØ¯.
اÛÙ ÙØ¸Ø±ÛÙ Ø¨ÙØ¯. ØØ§Ù Ø¨ÛØ§ÛÛØ¯ ببÛÙÛÙ ÚÚ¯ÙÙÙ Ù Û ØªÙØ§ÙÛ٠اÛÙ Ø¯Ø§ÙØ´ را ب٠کار ببرÛÙ .
Ø§Ø³ØªÙØ§Ø¯Ù Û±: ØªÙØ³Û٠کرد٠تسک ÙØ§Û CPU-hungry
Ø¨ÛØ§ÛÛØ¯ بگÙÛÛ٠ک٠٠ا ÛÚ© ÙØ¸ÛÙ٠تشÙÙ CPU دارÛÙ .
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ Ø¨Ø±Ø¬Ø³ØªÙ Ú©Ø±Ø¯Ù ÙØÙ (Ú©Ù Ø¨Ø±Ø§Û Ø±ÙÚ¯ Ø¢Ù ÛØ²Û ÙÙ ÙÙÙ ÙØ§Û کد در اÛÙ ØµÙØÙ Ø§Ø³ØªÙØ§Ø¯Ù Ù Û Ø´ÙØ¯) Ú©Ø§Ù ÙØ§Ù از ÙØ¸Ø± CPU سÙÚ¯Û٠است. Ø¨Ø±Ø§Û Ø¨Ø±Ø¬Ø³ØªÙ Ú©Ø±Ø¯Ù Ú©Ø¯Ø ØªØ¬Ø²Û٠٠تØÙÛ٠را Ø§ÙØ¬Ø§Ù Ù Û Ø¯ÙØ¯Ø Ø¹ÙØ§ØµØ± رÙÚ¯Û Ø²ÛØ§Ø¯Û Ø§ÛØ¬Ø§Ø¯ Ù Û Ú©ÙØ¯Ø Ø¢ÙÙØ§ را Ø¨Ù Ø³ÙØ¯ اضاÙÙ Ù Û Ú©ÙØ¯ â Ø¨Ø±Ø§Û Ù ÙØ¯Ø§Ø± Ø²ÛØ§Ø¯Û Ù ØªÙ Ú©Ù Ø²Ù Ø§Ù Ø²ÛØ§Ø¯Û Ù Û Ø¨Ø±Ø¯.
در ØØ§ÙÛ Ú©Ù Ù ÙØªÙر ٠شغÙ٠برجستÙâØ³Ø§Ø²Û ÙØÙ Ø§Ø³ØªØ ÙÙ ÛâØªÙØ§Ùد Ø³Ø§ÛØ± Ú©Ø§Ø±ÙØ§Û Ù Ø±Ø¨ÙØ· ب٠DOMØ Ù¾Ø±Ø¯Ø§Ø²Ø´ رÙÛØ¯Ø§Ø¯ÙØ§Û Ú©Ø§Ø±Ø¨Ø± Ù ØºÛØ±Ù را Ø§ÙØ¬Ø§Ù Ø¯ÙØ¯. ØØªÛ ٠٠ک٠است باعث Ø´ÙØ¯ Ù Ø±ÙØ±Ú¯Ø± Ø¨Ø±Ø§Û Ù Ø¯ØªÛ âhiccupâ ÛØ§ ØØªÛ âhangâ Ú©ÙØ¯Ø Ú©Ù ØºÛØ±ÙØ§Ø¨Ù ÙØ¨Ù٠است.
Ù
ا Ù
Û ØªÙØ§ÙÛÙ
با ØªÙØ³ÛÙ
کار بزرگ Ø¨Ù ÙØ·Ø¹Ø§Øª از Ù
Ø´Ú©ÙØ§Øª جÙÙÚ¯ÛØ±Û Ú©ÙÛÙ
. ابتدا 100 خط را برجست٠کÙÛØ¯Ø سپس setTimeout (با ØªØ§Ø®ÛØ± ØµÙØ±) را Ø¨Ø±Ø§Û 100 خط Ø¨Ø¹Ø¯Û Ø¨Ø±ÙØ§Ù
Ù Ø±ÛØ²Û Ú©ÙÛØ¯Ø ٠ب٠ÙÙ
ÛÙ ØªØ±ØªÛØ¨.
Ø¨Ø±Ø§Û ÙØ´Ø§Ù داد٠اÛ٠رÙÛÚ©Ø±Ø¯Ø Ø¨ÙâØ®Ø§Ø·Ø± Ø³Ø§Ø¯Ú¯ÛØ بÙâØ¬Ø§Û Ø¨Ø±Ø¬Ø³ØªÙâØ³Ø§Ø²Û Ù
ØªÙØ ØªØ§Ø¨Ø¹Û Ø±Ø§ Ø§ÙØªØ®Ø§Ø¨ Ù
ÛâÚ©ÙÛÙ
ک٠از 1 تا 1000000000 Ù
ØØ§Ø³Ø¨Ù Ù
ÛâØ´ÙØ¯.
اگر کد Ø²ÛØ± را اجرا Ú©ÙÛØ¯Ø Ù ÙØªÙر Ø¨Ø±Ø§Û Ù Ø¯ØªÛ âhangâ Ø®ÙØ§ÙØ¯ شد. Ø¨Ø±Ø§Û JS س٠ت Ø³Ø±ÙØ± Ú©Ù Ø¨Ù ÙØ¶ÙØ ÙØ§Ø¨Ù ØªÙØ¬Ù Ø§Ø³ØªØ Ù Ø§Ú¯Ø± آ٠را در Ù Ø±ÙØ±Ú¯Ø± اجرا Ù Û Ú©ÙÛØ¯Ø سپس Ø³Ø¹Û Ú©ÙÛØ¯ رÙÛ Ø¯Ú©Ù Ù ÙØ§Û دÛگر ØµÙØÙ Ú©ÙÛÚ© Ú©ÙÛØ¯ â Ø®ÙاÙÛØ¯ Ø¯ÛØ¯ ک٠تا ز٠اÙÛ Ú©Ù Ø´Ù Ø§Ø±Ø´ Ø¨Ù Ù¾Ø§ÛØ§Ù برسد ÙÛÚ Ø±ÙÛØ¯Ø§Ø¯ دÛÚ¯Ø±Û Ù Ø¯ÛØ±Ûت ÙÙ Û Ø´ÙØ¯.
let i = 0;
let start = Date.now();
function count() {
// do a heavy job
for (let j = 0; j < 1e9; j++) {
i++;
}
alert("Done in " + (Date.now() - start) + 'ms');
}
count();
ØØªÛ ٠٠ک٠است Ù Ø±ÙØ±Ú¯Ø± اخطار «اسکرÛپت Ø®ÛÙÛ Ø·ÙÙØ§ÙÛ Ø§Ø³ØªÂ» را ÙØ´Ø§Ù Ø¯ÙØ¯.
Ø¨ÛØ§ÛÛØ¯ کار را با Ø§Ø³ØªÙØ§Ø¯Ù از تÙ
اسâÙØ§Û setTimeout ØªÙØ¯Ø±ØªÙ ØªÙØ³ÛÙ
Ú©ÙÛÙ
:
let i = 0;
let start = Date.now();
function count() {
// do a piece of the heavy job (*)
do {
i++;
} while (i % 1e6 != 0);
if (i == 1e9) {
alert("Done in " + (Date.now() - start) + 'ms');
} else {
setTimeout(count); // schedule the new call (**)
}
}
count();
اکÙÙ٠رابط Ù Ø±ÙØ±Ú¯Ø± در Ø·ÙÙ ÙØ±Ø¢ÛÙØ¯ âØ´Ù Ø§Ø±Ø´â Ú©Ø§Ù ÙØ§Ù Ú©Ø§Ø±Ø¨Ø±Ø¯Û Ø§Ø³Øª.
ÛÚ© اجرا از «شÙ
ارش» Ø¨Ø®Ø´Û Ø§Ø² کار (*) را Ø§ÙØ¬Ø§Ù
Ù
Û Ø¯ÙØ¯Ø ٠سپس در ØµÙØ±Øª ÙÛØ§Ø²Ø (**) را Ø¯ÙØ¨Ø§Ø±Ù Ø¨Ø±ÙØ§Ù
Ù Ø±ÛØ²Û Ù
Û Ú©ÙØ¯:
- تعداد Ø§Ø¬Ø±Ø§Û Ø§ÙÙ:
i=1...1000000. - تعداد Ø§Ø¬Ø±Ø§Û Ø¯ÙÙ
:
i=1000001..2000000. - â¦ Ù ØºÛØ±Ù.
اکÙÙÙØ اگر ÛÚ© کار Ø¬Ø§ÙØ¨Û Ø¬Ø¯ÛØ¯ (Ù
Ø«ÙØ§Ù رÙÛØ¯Ø§Ø¯ onclick) در ØØ§ÙÛ Ú©Ù Ù
ÙØªÙر Ù
شغÙÙ Ø§Ø¬Ø±Ø§Û ÙØ³Ù
ت 1 است Ø¸Ø§ÙØ± Ø´ÙØ¯Ø در ØµÙ ÙØ±Ø§Ø± Ù
Û Ú¯ÛØ±Ø¯ ٠پس از اتÙ
اÙ
ÙØ³Ù
ت 1Ø ÙØ¨Ù از ÙØ³Ù
ت Ø¨Ø¹Ø¯ÛØ اجرا Ù
Û Ø´ÙØ¯. بازگشتâÙØ§Û Ø¯ÙØ±ÙâØ§Û Ø¨Ù ØÙÙ٠رÙÛØ¯Ø§Ø¯ بÛÙ Ø§Ø¬Ø±Ø§Û Â«Ø´Ù
Ø§Ø±Ø´Â»Ø ÙÙØ§Û کاÙÛ Ø±Ø§ Ø¨Ø±Ø§Û Ù
ÙØªÙر Ø¬Ø§ÙØ§ اسکرÛپت ÙØ±Ø§ÙÙ
Ù
ÛâÚ©ÙØ¯ تا Ø¨ØªÙØ§Ùد کار دÛÚ¯Ø±Û Ø§ÙØ¬Ø§Ù
Ø¯ÙØ¯ تا Ø¨Ù Ø³Ø§ÛØ± Ø§ÙØ¯Ø§Ù
ات کاربر ÙØ§Ú©ÙØ´ ÙØ´Ø§Ù Ø¯ÙØ¯.
ÙÚ©ØªÙ ÙØ§Ø¨Ù ØªÙØ¬Ù اÛ٠است Ú©Ù ÙØ± د٠ÙÙØ¹ â Ø¨Ø§ ٠بدÙÙ ØªÙØ³ÛÙ
کار با setTimeout â Ø§Ø² ÙØ¸Ø± سرعت ÙØ§Ø¨Ù Ù
ÙØ§ÛØ³Ù ÙØ³ØªÙد. ØªÙØ§Ùت Ø²ÛØ§Ø¯Û در زÙ
ا٠شÙ
ارش Ú©ÙÛ ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯.
Ø¨Ø±Ø§Û ÙØ²Ø¯ÛÚ©âØªØ± کرد٠آÙÙØ§Ø Ø¨ÛØ§ÛÛØ¯ Ø¨ÙØ¨ÙØ¯Û Ø§ÛØ¬Ø§Ø¯ Ú©ÙÛÙ .
زÙ
اÙâØ¨ÙØ¯Û را Ø¨Ù Ø§Ø¨ØªØ¯Ø§Û count() Ù
ÙØªÙÙ Ù
ÛâÚ©ÙÛÙ
:
let i = 0;
let start = Date.now();
function count() {
// move the scheduling to the beginning
if (i < 1e9 - 1e6) {
setTimeout(count); // schedule the new call
}
do {
i++;
} while (i % 1e6 != 0);
if (i == 1e9) {
alert("Done in " + (Date.now() - start) + 'ms');
}
}
count();
ØØ§Ùا ÙÙØªÛ Ø´Ø±ÙØ¹ ب٠count() Ù
Û Ú©ÙÛÙ
Ù Ù
Û Ø¨ÛÙÛÙ
Ú©Ù Ø¨Ø§ÛØ¯ count() Ø¨ÛØ´ØªØ±Û Ø§ÙØ¬Ø§Ù
دÙÛÙ
Ø Ø¨ÙØ§ÙاصÙÙ ÙØ¨Ù از Ø§ÙØ¬Ø§Ù
Ú©Ø§Ø±Ø Ø¢Ù Ø±Ø§ Ø¨Ø±ÙØ§Ù
Ù Ø±ÛØ²Û Ù
Û Ú©ÙÛÙ
.
اگر آ٠را اجرا Ú©ÙÛØ¯Ø Ø¨Ù Ø±Ø§ØØªÛ Ù ØªÙØ¬Ù Ù Û Ø´ÙÛØ¯ Ú©Ù Ø²Ù Ø§Ù Ø¨Ø³ÛØ§Ø± Ú©Ù ØªØ±Û Ù Û Ø¨Ø±Ø¯.
ÚØ±Ø§Ø
اÛ٠ساد٠است: ÙÙ
Ø§ÙØ·Ùر Ú©Ù Ø¨Ù ÛØ§Ø¯ Ø¯Ø§Ø±ÛØ¯Ø Ø¨Ø±Ø§Û Ø¨Ø³ÛØ§Ø±Û از تÙ
اسâÙØ§Û ØªÙØ¯Ø±ØªÙÛ setTimeoutØ ØØ¯Ø§ÙÙ ØªØ§Ø®ÛØ± 4 Ù
ÛÙÛâØ«Ø§ÙÛ٠در Ù
Ø±ÙØ±Ú¯Ø± ÙØ¬Ùد دارد. ØØªÛ اگر 0 را ØªÙØ¸ÛÙ
Ú©ÙÛÙ
Ø 4 Ù
ÛÙÛâØ«Ø§ÙÛÙ (ÛØ§ Ú©Ù
Û Ø¨ÛØ´ØªØ±) است. Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ ÙØ±ÚÙ Ø²ÙØ¯ØªØ± آ٠را Ø¨Ø±ÙØ§Ù
Ù Ø±ÛØ²Û Ú©ÙÛÙ
â Ø³Ø±Ûعتر اجرا Ù
Û Ø´ÙØ¯.
در ÙÙØ§ÛØªØ Ù Ø§ ÛÚ© کار تشÙÙ CPU را ب٠بخشâÙØ§ÛÛ ØªÙØ³Û٠کردÙâØ§ÛÙ â Ø§Ú©ÙÙ٠رابط Ú©Ø§Ø±Ø¨Ø±Û Ø±Ø§ Ù Ø³Ø¯ÙØ¯ ÙÙ ÛâÚ©ÙØ¯. Ù Ø²Ù Ø§Ù Ø§Ø¬Ø±Ø§Û Ú©ÙÛ Ø¢Ù Ø®ÛÙÛ Ø¨ÛØ´ØªØ± ÙÛØ³Øª.
Ø§Ø³ØªÙØ§Ø¯Ù Û²: ÙØ´Ø§ÙÙ Ù¾ÛØ´Ø±Ùت
ÛÚ©Û Ø¯Ûگر از Ù Ø²Ø§ÛØ§Û ØªÙØ³ÛÙ ÙØ¸Ø§Û٠سÙÚ¯ÛÙ Ø¨Ø±Ø§Û Ø§Ø³Ú©Ø±Ûپت ÙØ§Û Ù Ø±ÙØ±Ú¯Ø± اÛ٠است Ú©Ù Ù Û ØªÙØ§ÙÛÙ ÙØ´Ø§ÙÙ Ù¾ÛØ´Ø±Ùت را ÙØ´Ø§Ù دÙÛÙ .
ÙÙ Ø§ÙØ·Ùر Ú©Ù ÙØ¨Ùا ذکر Ø´Ø¯Ø ØªØºÛÛØ±Ø§Øª در DOM ØµØ±Ù ÙØ¸Ø± از ٠دت ز٠اÙÛ Ú©Ù Ø·ÙÙ Ù Û Ú©Ø´Ø¯Ø ØªÙÙØ§ پس از تک٠Û٠کار در ØØ§Ù اجرا Ø§ÙØ¬Ø§Ù Ù Û Ø´ÙØ¯.
از ÛÚ© Ø·Ø±ÙØ اÛ٠عاÙÛ Ø§Ø³ØªØ Ø²ÛØ±Ø§ ع٠Ùکرد ٠ا ٠٠ک٠است Ø¹ÙØ§ØµØ± Ø²ÛØ§Ø¯Û Ø§ÛØ¬Ø§Ø¯ Ú©ÙØ¯Ø Ø¢ÙÙØ§ را ÛÚ© ب٠ÛÚ© Ø¨Ù Ø³ÙØ¯ اضاÙÙ Ú©ÙØ¯ ٠سبک Ø¢ÙÙØ§ را تغÛÛØ± Ø¯ÙØ¯ â Ø¨Ø§Ø²Ø¯ÛدکÙÙØ¯Ù ÙÛÚ ØØ§Ùت âintermediateâ Ù ÙØ§ØªÙ ا٠را ÙØ®ÙØ§ÙØ¯ Ø¯ÛØ¯. ÛÚ© ÚÛØ² Ù ÙÙ Ø Ø¯Ø±Ø³Øª استØ
در اÛÙØ¬Ø§ ÙØ³Ø®Ù آزÙ
Ø§ÛØ´Û Ø§Ø³ØªØ ØªØºÛÛØ±Ø§Øª ب٠i تا زÙ
اÙÛ Ú©Ù Ø¹Ù
Ùکرد Ø¨Ù Ù¾Ø§ÛØ§Ù برسد ÙØ´Ø§Ù داد٠ÙÙ
Û Ø´ÙØ¯Ø Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ù
ا ÙÙØ· آخرÛÙ Ù
ÙØ¯Ø§Ø± را Ø®ÙØ§ÙÛÙ
Ø¯ÛØ¯:
<div id="progress"></div>
<script>
function count() {
for (let i = 0; i < 1e6; i++) {
i++;
progress.innerHTML = i;
}
}
count();
</script>
â¦Ø§Ù ا ٠ا ÙÙ ÚÙÛ٠٠٠ک٠است Ø¨Ø®ÙØ§ÙÛÙ ÚÛØ²Û را در Ø·Ù٠کار ÙØ´Ø§Ù دÙÛÙ Ø Ø¨Ù Ø¹ÙÙØ§Ù ٠ثاÙ. ÙÙØ§Ø± Ù¾ÛØ´Ø±Ùت
اگر کار سÙÚ¯Û٠را با Ø§Ø³ØªÙØ§Ø¯Ù از setTimeout Ø¨Ù ÙØ·Ø¹Ø§Øª ØªÙØ³ÛÙ
Ú©ÙÛÙ
Ø ØªØºÛÛØ±Ø§Øª در بÛ٠آÙÙØ§ Ø§ÛØ¬Ø§Ø¯ Ù
Û Ø´ÙØ¯.
اÛÙ Ø²ÛØ¨Ø§ØªØ± Ø¨Ù ÙØ¸Ø± Ù Û Ø±Ø³Ø¯:
<div id="progress"></div>
<script>
let i = 0;
function count() {
// do a piece of the heavy job (*)
do {
i++;
progress.innerHTML = i;
} while (i % 1e3 != 0);
if (i < 1e7) {
setTimeout(count);
}
}
count();
</script>
اکÙÙÙ <div> Ù
ÙØ§Ø¯Ûر Ø§ÙØ²Ø§ÛØ´Û i را ÙØ´Ø§Ù Ù
Û Ø¯ÙØ¯ Ú©Ù ÙÙØ¹Û ÙÙØ§Ø± Ù¾ÛØ´Ø±Ùت است.
Ø§Ø³ØªÙØ§Ø¯Ù Û³: Ø§ÙØ¬Ø§Ù Ø¯Ø§Ø¯Ù Ú©Ø§Ø±Û Ø¨Ø¹Ø¯ از event
در ÛÚ© Ú©ÙØªØ±Ù Ú©ÙÙØ¯Ù رÙÛØ¯Ø§Ø¯Ø Ù
Ù
ک٠است تصÙ
ÛÙ
Ø¨Ú¯ÛØ±ÛÙ
Ø¨Ø±Ø®Û Ø§Ø² Ø§ÙØ¯Ø§Ù
ات را تا زÙ
اÙÛ Ú©Ù Ø±ÙÛØ¯Ø§Ø¯ ØØ¨Ø§Ø¨Û Ø´ÙØ¯ ٠در ÙÙ
Ù Ø³Ø·ÙØ Ù
Ø¯ÛØ±Ûت Ø´ÙØ¯ ب٠تعÙÛÙ Ø¨ÛØ§ÙدازÛÙ
. Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
اÛ٠کار را با ÙØ±Ø§Ø± داد٠کد در setTimeout با ØªØ§Ø®ÛØ± ØµÙØ± Ø§ÙØ¬Ø§Ù
دÙÛÙ
.
در ÙØµÙ Dispatchکرد٠eventÙØ§Û Ø´Ø®ØµÛ Ø³Ø§Ø²Û Ø´Ø¯Ù Ù
ثاÙÛ Ø¯ÛØ¯ÛÙ
: رÙÛØ¯Ø§Ø¯ Ø³ÙØ§Ø±Ø´Û menu-open در setTimeout ارسا٠Ù
ÛâØ´ÙØ¯Ø Ø¨Ù Ø·ÙØ±Û ک٠پس از Ù
Ø¯ÛØ±Ûت کاÙ
٠رÙÛØ¯Ø§Ø¯ âclickâ Ø§ØªÙا٠Ù
ÛâØ§ÙØªØ¯.
menu.onclick = function() {
// ...
// create a custom event with the clicked menu item data
let customEvent = new CustomEvent("menu-open", {
bubbles: true
});
// dispatch the custom event asynchronously
setTimeout(() => menu.dispatchEvent(customEvent));
};
Macrotasks Ù Microtasks
در Ú©ÙØ§Ø± macrotasks ک٠در اÛÙ ÙØµÙ ØªÙØ¶ÛØ Ø¯Ø§Ø¯Ù Ø´Ø¯Ù Ø§Ø³ØªØ microtask ÙÛØ² ÙØ¬Ùد دارد ک٠در ÙØµÙ Microtasks ذکر شد٠است.
Ø±ÛØ²Ú©Ø§Ø±Ùا ÙÙØ· از کد Ù
ا Ù
Û Ø¢ÛÙØ¯. Ø¢ÙÙØ§ Ù
عÙ
ÙÙØ§Ù با ÙØ¹Ø¯ÙâÙØ§ Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙÙØ¯: Ø§Ø¬Ø±Ø§Û Ú©ÙØªØ±ÙâÚ©ÙÙØ¯Ù .then/catch/finally تبدÛ٠ب٠ÛÚ© ÙØ¸ÛÙÙ Ú©ÙÚÚ© Ù
ÛâØ´ÙØ¯. ÙØ¸Ø§ÛÙ Ø±ÛØ² âunder the coverâ await ÙÛØ² Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙØ¯Ø Ø²ÛØ±Ø§ شک٠دÛÚ¯Ø±Û Ø§Ø² Ø±Ø³ÛØ¯Ú¯Û Ø¨Ù ÙØ¹Ø¯Ù است.
ÙÙ
ÚÙÛÙ ÛÚ© تابع خاص queueMicrotask(func) ÙØ¬Ùد دارد Ú©Ù func را Ø¨Ø±Ø§Û Ø§Ø¬Ø±Ø§ در ص٠microtask ÙØ±Ø§Ø± Ù
Û Ø¯ÙØ¯.
Ø¨ÙØ§ÙاصÙ٠بعد از ÙØ± macrotaskØ Ù ÙØªÙر ØªÙ Ø§Ù ÙØ¸Ø§Û٠را از ص٠microtask اجرا Ù Û Ú©ÙØ¯Ø ÙØ¨Ù از Ø§Ø¬Ø±Ø§Û ÙØ± Ù Ø§Ú©Ø±ÙØªØ³Ú© دÛگر ÛØ§ Ø±ÙØ¯Ø± ÛØ§ ÙØ± ÚÛØ² دÛگرÛ.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù ÙگاÙÛ Ø¨ÛÙØ¯Ø§Ø²Ûد:
setTimeout(() => alert("timeout"));
Promise.resolve()
.then(() => alert("promise"));
alert("code");
Ø¯Ø³ØªÙØ± اÛÙØ¬Ø§ ÚÙ Ø®ÙØ§Ùد Ø¨ÙØ¯Ø
codeابتدا ÙØ´Ø§Ù Ø¯Ø§Ø¯Ù Ù Û Ø´ÙØ¯Ø Ø²ÛØ±Ø§ ÛÚ© ت٠اس Ù٠ز٠ا٠٠ع٠ÙÙÛ Ø§Ø³Øª.promiseدÙ٠را ÙØ´Ø§Ù Ù ÛâØ¯ÙØ¯Ø Ø²ÛØ±Ø§ «.then» از ص٠microtask Ø¹Ø¨ÙØ± Ù ÛâÚ©ÙØ¯ ٠بعد از کد ÙØ¹ÙÛ Ø§Ø¬Ø±Ø§ Ù ÛâØ´ÙØ¯.timeoutآخرÛÙ ÙÙ Ø§ÛØ´ را ÙØ´Ø§Ù Ù ÛâØ¯ÙØ¯Ø Ø²ÛØ±Ø§ اÛÙ ÛÚ© ÙØ¸ÛÙ٠بزرگ است.
تصÙÛØ± ØÙÙ٠رÙÛØ¯Ø§Ø¯ غÙÛ ØªØ± ب٠اÛ٠شک٠است (ØªØ±ØªÛØ¨ از Ø¨Ø§ÙØ§ ب٠پاÛÛÙ Ø§Ø³ØªØ ÛØ¹ÙÛ: ابتدا اسکرÛÙ¾ØªØ Ø³Ù¾Ø³ Ø±ÛØ² ÙØ¸Ø§ÛÙØ Ø±ÙØ¯Ø± Ù ØºÛØ±Ù):
ÙÙ Ù Ø±ÛØ²ÙظÛÙÙ ÙØ§ ÙØ¨Ù از Ø§ÙØ¬Ø§Ù ÙØ± Ú¯ÙÙÙ Ù Ø¯ÛØ±Ûت ÛØ§ Ø±ÙØ¯Ø± رÙÛØ¯Ø§Ø¯ ÛØ§ ÙØ± ÙØ¸ÛÙÙ Ú©ÙØ§Ù دÛÚ¯Ø±Û ØªÚ©Ù ÛÙ Ù Û Ø´ÙÙØ¯.
اÛÙ Ù ÙÙ Ø§Ø³ØªØ Ø²ÛØ±Ø§ تض٠ÛÙ Ù ÛâÚ©ÙØ¯ Ú©Ù Ù ØÛØ· Ø¨Ø±ÙØ§Ù ٠اساسا٠Ûکسا٠است (بدÙ٠تغÛÛØ± ٠ختصات Ù Ø§ÙØ³Ø بدÙ٠دادÙâÙØ§Û Ø´Ø¨Ú©Ù Ø¬Ø¯ÛØ¯ Ù ØºÛØ±Ù) بÛÙ Ø±ÛØ²Ú©Ø§Ø±Ùا.
اگر Ø¨Ø®ÙØ§ÙÛÙ
ÛÚ© تابع را Ø¨Ù ØµÙØ±Øª ÙØ§ÙÙ
زÙ
ا٠(بعد از کد ÙØ¹ÙÛ) اجرا Ú©ÙÛÙ
Ø Ø§Ù
ا ÙØ¨Ù از Ø±ÙØ¯Ø± شد٠تغÛÛØ±Ø§Øª ÛØ§ Ù
Ø¯ÛØ±Ûت رÙÛØ¯Ø§Ø¯ÙØ§Û Ø¬Ø¯ÛØ¯Ø Ù
ÛâØªÙØ§ÙÛÙ
آ٠را با queueMicrotask زÙ
اÙâØ¨ÙØ¯Û Ú©ÙÛÙ
.
در اÛÙØ¬Ø§ ÛÚ© Ù
ثا٠با âcounting progress barâ ÙØ¬Ùد Ø¯Ø§Ø±Ø¯Ø Ù
شاب٠آÙÚÙ ÙØ¨Ùا ÙØ´Ø§Ù Ø¯Ø§Ø¯Ù Ø´Ø¯Ù Ø§Ø³ØªØ Ø§Ù
ا از queueMicrotask Ø¨Ù Ø¬Ø§Û setTimeout Ø§Ø³ØªÙØ§Ø¯Ù شد٠است. Ù
Û Ø¨ÛÙÛØ¯ ک٠در Ø§ÙØªÙا Ø±ÙØ¯Ø± Ù
Û Ø´ÙØ¯. درست Ù
اÙÙØ¯ کد ÙÙ
زÙ
اÙ:
<div id="progress"></div>
<script>
let i = 0;
function count() {
// do a piece of the heavy job (*)
do {
i++;
progress.innerHTML = i;
} while (i % 1e3 != 0);
if (i < 1e6) {
queueMicrotask(count);
}
}
count();
</script>
Ø®ÙØ§ØµÙ
ÛÚ© اÙÚ¯ÙØ±Ûت٠ØÙÙ٠رÙÛØ¯Ø§Ø¯ دÙÛ٠تر (اگرÚ٠در Ù ÙØ§Ûس٠با specificationÙÙÙØ² ساد٠شد٠است):
- ÙØ¯ÛÙ Û ØªØ±Û٠کار را از ص٠macrotask (ب٠عÙÙØ§Ù Ù Ø«Ø§Ù âØ§Ø³Ú©Ø±Ûپتâ) در ØµÙ ÙØ±Ø§Ø± دÙÛØ¯ ٠اجرا Ú©ÙÛØ¯.
- ÙÙ
Ù Micro TaskÙØ§ را اجرا Ú©ÙÛØ¯:
- در ØØ§ÙÛ Ú©Ù ØµÙ microtask خاÙÛ ÙÛØ³Øª:
- ÙØ¯ÛÙ Û ØªØ±ÛÙ Ø±ÛØ²ØªØ³Ú© را Dequeue ٠اجرا Ú©ÙÛØ¯.
- در ØØ§ÙÛ Ú©Ù ØµÙ microtask خاÙÛ ÙÛØ³Øª:
- در ØµÙØ±Øª ÙØ¬Ùد تغÛÛØ±Ø§Øª Ø±ÙØ¯Ø±.
- اگر ØµÙ Ù Ø§Ú©Ø±ÙØªØ³Ú© خاÙÛ Ø§Ø³ØªØ ØµØ¨Ø± Ú©ÙÛØ¯ تا ÛÚ© Ù Ø§Ú©Ø±ÙØªØ³Ú© Ø¸Ø§ÙØ± Ø´ÙØ¯.
- ب٠٠رØÙÙ 1 برÙÛØ¯.
Ø¨Ø±Ø§Û Ø¨Ø±ÙØ§Ù Ù Ø±ÛØ²Û ÛÚ© macrotask Ø¬Ø¯ÛØ¯:
- از
setTimeout(f)با ØªØ§Ø®ÛØ± ØµÙØ± Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯.
اÛ٠٠٠ک٠است Ø¨Ø±Ø§Û ØªÙØ³ÛÙ ÛÚ© کار سÙÚ¯ÛÙ Ù ØØ§Ø³Ø¨Ø§ØªÛ Ø¨Ù ÙØ·Ø¹Ø§Øª Ø§Ø³ØªÙØ§Ø¯Ù Ø´ÙØ¯ تا Ù Ø±ÙØ±Ú¯Ø± Ø¨ØªÙØ§Ùد ب٠رÙÛØ¯Ø§Ø¯ÙØ§Û Ú©Ø§Ø±Ø¨Ø± ÙØ§Ú©ÙØ´ ÙØ´Ø§Ù Ø¯ÙØ¯ Ù Ù¾ÛØ´Ø±Ùت بÛ٠آÙÙØ§ را ÙØ´Ø§Ù Ø¯ÙØ¯.
ÙÙ ÚÙÛ٠در Ú©ÙØªØ±ÙâÚ©ÙÙØ¯ÙâÙØ§Û رÙÛØ¯Ø§Ø¯ Ø¨Ø±Ø§Û Ø¨Ø±ÙØ§Ù ÙâØ±ÛØ²Û ÛÚ© ع٠٠پس از Ù Ø¯ÛØ±Ûت کا٠٠رÙÛØ¯Ø§Ø¯ (ØØ¨Ø§Ø¨âØ³Ø§Ø²Û Ø§ÙØ¬Ø§Ù شد) Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙØ¯.
Ø¨Ø±Ø§Û Ø¨Ø±ÙØ§Ù Ù Ø±ÛØ²Û ÛÚ© microtask Ø¬Ø¯ÛØ¯
- از
setTimeout(f)Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. - ÙÙ ÚÙÛ٠ب٠گرداÙÙØ¯Ú¯Ø§Ù ÙØ¹Ø¯Ù Ø¯Ø§Ø¯Ù Ù Û Ø´ÙØ¯ ک٠از ص٠microtask Ø¹Ø¨ÙØ± Ú©ÙÙØ¯.
ÙÛÚ Ø±Ø§Ø¨Ø· Ú©Ø§Ø±Ø¨Ø±Û ÛØ§ Ù Ø¯ÛØ±Ûت رÙÛØ¯Ø§Ø¯ شبک٠بÛÙ Ø±ÛØ²Ú©Ø§Ø±Ùا ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯: Ø¢ÙÙØ§ Ø¨ÙØ§ÙاصÙÙ ÛÚ©Û Ù¾Ø³ از دÛÚ¯Ø±Û Ø§Ø¬Ø±Ø§ Ù Û Ø´ÙÙØ¯.
Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ù
Ù
ک٠است Ú©Ø³Û Ø¨Ø®ÙØ§Ùد Ú©Ù queueMicrotask را Ø¨Ø±Ø§Û Ø§Ø¬Ø±Ø§Û ÛÚ© تابع Ø¨Ù ØµÙØ±Øª ÙØ§ÙÙ
زÙ
Ø§ÙØ اÙ
ا در ØØ§Ùت Ù
ØÛØ·Û Ø¨Ø®ÙØ§Ùد.
Ø¨Ø±Ø§Û Ù ØØ§Ø³Ø¨Ø§Øª سÙÚ¯ÛÙ Ø·ÙÙØ§ÙÛ Ú©Ù ÙØ¨Ø§Ûد ØÙÙ٠رÙÛØ¯Ø§Ø¯ را Ù Ø³Ø¯ÙØ¯ Ú©ÙØ¯Ø Ù ÛâØªÙØ§ÙÛ٠از Web Workers Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ .
اÛ٠راÙÛ Ø¨Ø±Ø§Û Ø§Ø¬Ø±Ø§Û Ú©Ø¯ در ÛÚ© Ø±Ø´ØªÙ Ù ÙØ§Ø²Û دÛگر است.
Web Workers Ù ÛâØªÙØ§ÙÙØ¯ Ù¾ÛØ§Ù âÙØ§ را با ÙØ±Ø¢ÛÙØ¯ اصÙÛ Ù Ø¨Ø§Ø¯ÙÙ Ú©ÙÙØ¯Ø ا٠ا Ù ØªØºÛØ±ÙØ§Û Ø®ÙØ¯ Ù ØÙÙ٠رÙÛØ¯Ø§Ø¯ Ø®ÙØ¯ را Ø¯Ø§Ø±ÙØ¯.
Web Workers ب٠DOM Ø¯Ø³ØªØ±Ø³Û ÙØ¯Ø§Ø±ÙØ¯Ø Ø¨ÙØ§Ø¨Ø±Ø§Û٠آÙÙØ§ Ø¹Ù Ø¯ØªØ§Ù Ø¨Ø±Ø§Û Ù ØØ§Ø³Ø¨Ø§Øª Ù ÙÛØ¯ ÙØ³ØªÙد تا از ÚÙØ¯ÛÙ ÙØ³ØªÙ CPU Ø¨Ù Ø·ÙØ± ÙÙ Ø²Ù Ø§Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÙØ¯.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)