مهدی
4 سال پیش توسط مهدی مطرح شد
2 پاسخ

event loop phases

سلام به همه
یک سوال برام پیش اومده در مورد فاز های event loop . خوب 6 فاز داریم
timers
pending callbacks
idle, prepare
poll
check
close callbacks
الان من اومدم یک همچین کدی رو نوشتم

const fs = require('fs');
const http = require('http');
console.log("start\n");

http.createServer().listen(8080, () => {
    console.log('this is connection\n');
});

setTimeout(() => { console.log("timeOut finished\n"); }, 0);
fs.readFile("name.txt", 'utf-8', (err, data) => {
    console.log(`${data}\n`);
});
setImmediate(() => {
    console.log('executing setImmediate callback\n');
    setTimeout(() => {
        console.log("second time out finished \n");
    }, 0);
});
console.log("end\n");

الان برای من توضیحی بدین که چرا وقتی یک فایلی رو میخونم این در آخر برای من چاپ میشه دیتاش . و وقتی یک سروری رو بالا میارم بعد
end , start ران میشه ؟
ترتیب ران شدنش هم اینجوری هست :
start

end

this is connection

timeOut finished

executing setImmediate callback

second time out finished

this data returend from fs

خوب اون متد های settimeout اینا میرن تو فاز timer و هر فقط stack خالی شد یکی یکی اجرا میشن .
و اینکه کدام proccess میره توی کدام phase
خوشحال میشم جوابی بدین :)


ثبت پرسش جدید
aaty
@aaty2020 2 ماه پیش مطرح شد
0

سلام خواستم به دوستان عزیز سایتی رو معرفی کنم که به صورت تصویری نحوه اجرای دستورات توی js و در مرورگر رو یاد میده البته توی github گفته که به زودی event loop مربوط به node.js رو هم اضافه میکنه خیلی جالبه فقط نمیدونم 100 درصد درست کار میکنه یا نه موفق باشید.
https://vault-developer.github.io/event-loop-explorer/


محمد مهدی زمانی
تخصص : برنامه نویس
@30bshop 7 ساعت پیش مطرح شد
0

سلام
برای اینکه بفهمیم چرا ترتیب اجرای خروجی اینطوریه، باید بدونیم Node.js چطور فازهای مختلف Event Loop رو مدیریت می‌کنه.

خلاصه رفتار کد شما:

bash
Copy
Edit
start
end
this is connection
timeOut finished
executing setImmediate callback
second time out finished
this data returned from fs

توضیح مرحله به مرحله:
start و end چون کدهای همگام (sync) هستن، همون لحظه اجرا می‌شن.

http.createServer().listen(...) یه عملیات async هست. وقتی سرور بالا بیاد، callback اون اجرا میشه که معمولاً بلافاصله بعد از کد sync هست.

setTimeout(..., 0) میره توی فاز Timers و اجرا میشه وقتی Event Loop به اون فاز برسه.

fs.readFile یه عملیات I/O هست و callback اون توی فاز Poll اجرا میشه، معمولاً دیرتر از setTimeout.

setImmediate(...) مخصوص فاز Check هست و معمولاً بعد از I/O اجرا میشه، ولی چون fs.readFile ممکنه طول بکشه، setImmediate زودتر اجرا میشه.

setTimeout داخل setImmediate هم میره برای فاز Timers بعدی و به همین دلیل بعدش اجرا میشه.

پس چرا readFile آخر اجرا شد؟
چون readFile جزو عملیات‌های I/O هست و callback اون در فاز Poll اجرا میشه، که معمولاً بعد از Timers و Check هست. به همین دلیل خروجی فایل در آخر نمایش داده میشه.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام