سلام به همه
یک سوال برام پیش اومده در مورد فاز های 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
خوشحال میشم جوابی بدین :)
سلام خواستم به دوستان عزیز سایتی رو معرفی کنم که به صورت تصویری نحوه اجرای دستورات توی js و در مرورگر رو یاد میده البته توی github گفته که به زودی event loop مربوط به node.js رو هم اضافه میکنه خیلی جالبه فقط نمیدونم 100 درصد درست کار میکنه یا نه موفق باشید.
https://vault-developer.github.io/event-loop-explorer/
سلام
برای اینکه بفهمیم چرا ترتیب اجرای خروجی اینطوریه، باید بدونیم 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 هست. به همین دلیل خروجی فایل در آخر نمایش داده میشه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟