از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش استفاده از تایمرها و رویدادها در Node.jsNode.js دارای چندین ابزار کاربردی برای مدیریت رویدادها و همچنین زمان بندی اجرای کد است. این ابزارهای کمکی، ترکیبی، به شما این امکان را میدهند که به صورت واکنشی در زمان مناسب پاسخ دهید، به عنوان مثال: پاک کردن دادههای جلسه زمانی که کاربر از سیستم خارج میشود زمانبندی زمانبندی برای دریافت نتایج از یک تماس API…
سرفصلهای مطلب
رویدادها و تایمرها در Node.js
Node.js دارای چندین ابزار کاربردی برای مدیریت رویدادها و همچنین زمان بندی اجرای کد است. این ابزارهای کمکی، ترکیبی، به شما این امکان را می دهند که به طور واکنشی در زمان مناسب پاسخ دهید، به عنوان مثال:
- پاک کردن داده های جلسه زمانی که کاربر از سیستم خارج می شود
- زمانبندی زمانبندی برای دریافت نتایج از تماس API و تعیین کد رسیدگی به خطا برای اجرا در صورت وقفه
- بستن اتصالات پایگاه داده قبل از خروج از Node.js
در این مقاله به روش انجام آن می پردازیم تایمرها در Node.js کار کنید. همچنین روش عملکرد حلقه رویداد Node.js و روش استفاده از قابلیتهای مدیریت رویداد Node را معرفی خواهیم کرد.
تایمرها
اولین مجموعه از ابزارهایی که به آنها نگاه خواهیم کرد عبارتند از setTimeout
، setImmediate
، و setInterval
ابزارهای زمان بندی با این ابزارها می توانیم زمان اجرای کد را کنترل کنیم.
چرا این مهم خواهد بود؟ در Node.js، مشابه زمانی که از زبان های برنامه نویسی دیگر مانند C، Python، Java و دیگران استفاده می کنید، به برنامه ریزی عملکردهای خاص برای اجرای مکرر کمک می کند.
به عنوان مثال، فرض کنید میخواهیم فایلهای خاصی را از یک مکان دریافت کننده به یک آرشیو دائمی کپی کنیم. این یک سناریوی خوب برای برنامه ریزی انتقال فایل خواهد بود. در فواصل زمانی معین، میتوانیم فایلهای جدید را بررسی کرده و سپس آنها را در فایل کپی کنیم backup مکان در صورت وجود
setTimeout
با setTimeout
، میتوانیم کدها را برنامهریزی کنیم تا پس از گذشت مدت زمان مشخصی اجرا شوند.
// setTimeout.js
let cue = 'The actors are here!';
// However, the cue is not announced until at least 5000ms have
// passed through the use of setTimeout
setTimeout(function() {
return console.log(cue);
}, 5000);
// This console log is executed right away
console.log('An exploration of art and music. And now, as we wait for the actors...');
برای اجرای این کد و مشاهده آن در عمل، اجرا کنید node setTimeout.js
در شما terminal:
$ node setTimeout.js
An exploration of art and music. And now, as we wait for the actors...
The actors are here!
توجه کنید که چگونه حتی اگر console('An exploration...')
تماس است بعد از ما console.log(cue)
تماس بگیرید، هنوز هم اول اجرا می شود.
ترفندی که در اینجا باید فهمید این است که اجرای کد فقط پس از گذشت حداقل آن مدت زمان تضمین شده است، درست نیست. روی نقطه.
setInterval
در شرایطی که به اجرای کدهای مکرر و منظم نیاز دارید، مانند نظرسنجی طولانی، سپس setInterval
روش مناسب تری خواهد بود setTimeout
. با این تابع می توانیم یک تابع را مشخص کنیم که هر X ثانیه اجرا شود. تابع در واقع آرگومان خود را در میلی ثانیه می گیرد، بنابراین شما باید قبل از وارد کردن آرگومان های خود، تبدیل را خودتان انجام دهید.
فرض کنید میخواهیم طول صف را در مکدونالدز بررسی کنیم تا کاربران برنامه ما بتوانند در بهترین زمان از آن خارج شوند. استفاده کردن setInterval
، می توانیم بارها طول صف را بررسی کنیم و به آنها بگوییم که ساحل صاف است.
// setInterval.js
// This function simulates us checking the length
// of a McDonald's drive-through queue
let getQueueLength = function() {
return Math.round(12 * Math.random());
};
// We would like to retrieve the queue length at regular intervals
// this way, we can decide when to make a quick dash over
// at the optimal time
setInterval(function() {
let queueLength = getQueueLength();
console.log(`The queue at the McDonald's drive-through is now ${queueLength} cars long.`);
if (queueLength === 0) {
console.log('Quick, grab your coat!');
}
if (queueLength > 8) {
return console.log('This is beginning to look impossible!');
}
}, 3000);
در زیر می توانید خروجی را مشاهده کنید. کد را با node setInterval.js
، همانطور که در زیر نشان داده شده است:.
$ node setTimeout.js
The queue at the McDonald's drive-through is now 6 cars long.
The queue at the McDonald's drive-through is now 0 cars long.
Quick, grab your coat!
The queue at the McDonald's drive-through is now 1 cars long.
The queue at the McDonald's drive-through is now 3 cars long.
The queue at the McDonald's drive-through is now 9 cars long.
This is beginning to look impossible!
The queue at the McDonald's drive-through is now 0 cars long.
Quick, grab your coat!
The queue at the McDonald's drive-through is now 10 cars long.
This is beginning to look impossible!
تنظیم فوری
اگر بخواهیم یک تابع تا حد امکان فوری اجرا شود، از آن استفاده می کنیم setImmediate
. تابعی که به این ترتیب اجرا می کنیم، جلوتر از همه اجرا می شود setTimeout
یا setInterval
به محض اینکه حلقه رویداد فعلی Node.js فراخوانی تماس های رویداد را تمام کرد، تماس می گیرد.
در اینجا یک نمونه از این در است process. با دستور می توانید این کد را اجرا کنید node setImmediate.js
// setImmediate.js
// A timeout
setTimeout(function() {
console.log('I am a timeout');
}, 5000);
// An interval
setInterval(function() {
console.log('I am an interval');
}, 5000);
// An immediate, its callback will be executed before those defined above
setImmediate(function() {
console.log('I am an immediate');
});
// IO callbacks and code in the normal event loop runs before the timers
console.log('I am a normal statement in the event loop, guess what comes next?');
$ node setImmediate.js
I am a normal statement in the event loop, guess what comes next?
I am an immediate
I am a timeout
I am an interval
I am an interval
I am an interval
...
این setImmediate
پاسخ تماس، هر چند تعریف شده است بعد از کسانی که برای setInterval
و setTimeout
، جلوتر از آنها خواهد دوید.
حلقه رویداد
سوالی که ممکن است برای شما پیش آمده باشد این است که “Node.js چگونه تمام این زمان ها، تایمرها و رویدادها را پیگیری می کند؟ ترتیب اجرا چگونه اولویت بندی می شود؟” این یک خط تحقیق خوب است و نیاز به بررسی چیزی به نام “حلقه رویداد Node.js” دارد.
بنابراین، حلقه رویداد چیست؟
این حلقه رویداد به سادگی یک چرخه تکراری است که Node.js از طریق پردازش محاسبات سوئیچ می کند. از آنجایی که نمی تواند همه محاسبات ممکن را به طور همزمان انجام دهد، به عنوان تک رشته ای، از محاسبات به محاسبات در یک حلقه کاملاً تعریف شده به نام حلقه رویداد تغییر می کند.
حلقه رویداد دارای مراحل اساسی زیر است:
- تایمر – فراخوان هایی را اجرا می کند که با آنها برنامه ریزی شده اند
setTimeout
وsetInterval
- پاسخ به تماس های معلق – هر تماسی را که آماده اجرا هستند اجرا می کند
- بیکار، آماده – داخلی Node.js
- نظرسنجی – اتصالات ورودی و پردازش داده را می پذیرد
- بررسی – با استفاده از تنظیم تماسهای برگشتی را فراخوانی میکند
setImmediate
- بستن تماسهای برگشتی – برای رویدادهای نزدیک، تماسهای برگشتی را اجرا میکند
Event Loop ستون فقرات کار با رویدادها و سایر تماسهای ناهمزمان در Node.js است. این به ما اجازه می دهد تا قلاب هایی را در نقاط خاصی قرار دهیم که در طول حلقه ضربه می زنند.
پاسخگویی به بازگشتهای ناهمزمان با تماسهای تلفنی
با توجه به ماهیت تک رشته ای Node.js، عملیات طولانی مدت مانند خواندن فایل یا پرس و جوهای پایگاه داده به سرعت در سیستم عامل بارگذاری می شوند، سپس Node.js حلقه رویداد خود را به طور معمول ادامه می دهد. این کارها را کارآمد و سریع نگه می دارد.
این فرآیندهای سیستم عامل چگونه با Node.js تعامل دارند process? از طریق ابزار برگشت تماس. ما از یک callback برای ناهمزمان استفاده می کنیم process چیزهایی در پس زمینه، پس hook پس از اتمام کار ناهمزمان به حلقه رویداد بازگردید. برای دریافت این نوع عملکرد در سایر زبان های برنامه نویسی، ممکن است از یک صف کار مانند استفاده کنید کرفس در پایتون یا سیدیک که در Ruby. در Node.js، از آنجا که حلقه رویداد و اجرای ناهمزمان Node.js قبلاً موارد را به طور خودکار برای شما در صف قرار می دهند، شما این پردازش ناهمزمان را به صورت رایگان دریافت می کنید.
برای دیدن تماسهای برگشتی در عمل، میخواهیم یک فایل را از سیستم فایل بخوانیم و از تماس برگشتی استفاده کنیم print از محتویات
اولین قدم ایجاد فایل است. در این مورد، ما از یک فایل متنی استفاده می کنیم که شامل سطرهای یک شعر از تی اس الیوت است. شما می توانید فایل خود را جایگزین کنید. این فایل نام دارد poem.txt
و می توانید مطالب زیر را در آن قرار دهید.
// poem.txt
Macavity - The Mystery Cat, by T. S. Eliot
Macavity's a Mystery Cat: he's called the Hidden Paw--
For he's the master criminal who can defy the Law.
He's the bafflement of Scotland Yard, the Flying Squad's despair:
For when they reach the scene of crime--Macavity's not there!
Macavity, Macavity, there's no one like Macavity,
He's broken every human law, he breaks the law of gravity.
His powers of levitation would make a fakir stare,
And when you reach the scene of crime--Macavity's not there!
You may seek him in the basement, you may look up in the air--
But I tell you once and once again, Macavity's not there!
در همان دایرکتوری، اسکریپت خود را ایجاد می کنیم که این فایل شعر را می خواند و print آن را به عقب برگرداند. پس از اینکه سیستم عامل نتیجه فایل خوانده شده را برگرداند، چاپ فایل یا رسیدگی به یک خطا برای ما در یک فراخوانی انجام می شود. همانطور که در زیر نشان داده شده است، در readFile.js
، پاسخ تماس شما پس از سیستم عامل ناهمزمان فعال می شود process برمی گرداند. هنگامی که این سیستم عامل process برمیگرداند، پاسخ تماس Node.js که ارائه کردهاید قرار میگیرد روی حلقه رویدادی که باید پردازش شود، که پس از رسیدن حلقه به آن، اجرا می شود process.
سپس تماس پاسخ شما می تواند هر کاری انجام دهد، از به روز رسانی وضعیت در برنامه، رسیدگی به یک خطا، در صورت وجود، و خروج کاربر از سیستم، انجام هیچ کاری یا حتی پایان دادن به Node. process به طور کامل
// readFile.js
const fs = require('fs');
// Attempt to read the poem file
// Attach a callback to handle a successful read and print the contents to console
fs.readFile('./poem.txt', 'utf-8', function(err, data) {
if (err) return console.error(err);
let poem = data.toString();
console.log('Here is the poem of the day...\n\n');
return console.log(data);
});
این کد را با node readFile.js
. فایل خوانده خواهد شد و console باید print شعر به تو برمی گردد اگر اینطور نیست print برای مثال، اگر چنین فایلی در مسیر مشخص شده وجود نداشته باشد، خطای رخ داده را حذف کنید.
تماسهای تلفنی برای مدیریت یکباره دادهها، خطاها و رویدادها مناسب هستند. با این حال، تماسهای برگشتی زمانی میتوانند پیچیده شوند که در چندین سطح در عمق قرار گیرند. یکی دیگر از راه های جایگزین برای مدیریت رویدادها استفاده از Event Listeners است که در بخش بعدی به آن پرداخته می شود.
پاسخگویی به رویدادها با شنوندگان رویداد
شنوندگان رویداد، توابعی هستند که زمانی اجرا می شوند که انواع رویدادهای خاص رخ می دهند. به عنوان مثال، هنگام خواندن یک فایل، ایجاد اتصال به سرور یا جستجو در یک پایگاه داده، ماژول هایی که ما از آنها استفاده می کنیم، مانند fs
، net
، یا mongoose
، همه دارای انواع رویداد داخلی هستند که منتشر خواهند کرد.
اشیایی که معمولاً این رویدادها را ساطع می کنند، پایه را گسترش می دهند EventEmitter
شی، که از داخلی می آید مناسبت ها مدول.
برنامه شما می تواند از طریق مکانیسم شنوندگان رویداد به این رویدادها پاسخ دهد. به طور معمول، شما یک شنونده رویداد را به صورت کد از طریق کلمه کلیدی ” پیوست می کنید.روی”، به دنبال آن یک رشته که نوع رویداد را مشخص می کند، و سپس یک تابع، که کدی است که هنگام وقوع رویداد اجرا می شود.
برای مشاهده عملکرد شنوندگان رویداد، میخواهیم سروری ایجاد کنیم که با Cat API تعامل داشته باشد و پاسخهای API را تجزیه کند. سرور ما سپس درخواست ها را ارائه می دهد و تصویر “گربه روز” را به بازدیدکنندگان نشان می دهد. رویدادهایی که ما با آنها کار خواهیم کرد بخشی از آن هستند http
مدول.
ما همچنین از a استفاده خواهیم کرد ماژول xml2js برای تجزیه پاسخ های XML که Cat API تولید می کند. برای نصب xml2js
، می خواهید دستور را اجرا کنید npm install xml2js
در یک فهرست پروژه مناسب
پس از نصب ماژول، دو فایل در دایرکتوری ایجاد کنید. cats.html
، و cats.js
. داخل cats.html
، قسمت جلویی برنامه ما را قرار دهید. این به سادگی داده های گربه ای را که قرار است تجزیه کنیم نمایش می دهد.
<!-- cats.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Cats</title>
<!-- Bootstrap -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--(if lt IE 9)>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.2/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<!(endif)-->
</head>
<body>
<div class="container-fluid">
<div class="col-md-8 col-md-offset-2">
<h1>Cats Of Silicon Valley</h1>
<h2>Welcome to the Cat Of The Day</h2>
<img src=IMGSRC class="img-fluid" alt="Responsive image">
<br>
<label class="primary">Source: SOURCE</label>
<br>
<a href="/" class="btn btn-primary btn-lg">More Cats!</a>
</div>
</div>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>
بخش عمده ای از منطق ما در کد سمت سرور است که با شنوندگان رویداد کار می کند. این موجود در cats.js
فایل. برای مشاهده عملکرد کد شنونده رویداد، کد زیر را داخل فایل قرار دهید، سپس آن را با آن اجرا کنید node cats.js
، و در مرورگر خود، بازدید کنید http://localhost:4000
.
// cat.js
const http = require('http');
const fs = require('fs');
const xml2js = require('xml2js');
// We will get images from the CatAPI https://thecatapi.com/
let catApi = 'http://thecatapi.com/api/images/get؟format=xml&results_per_page=1';
let catUrl = '';
let catSource = '';
let server = http.createServer(function(req, res) {
// Get fresh cat data from the Cat API
http.get(catApi, (res) => {
let data = '';
// Attach event listener for when receiving data from the remote server is complete
res.روی('end', () => {
console.log('***We have completed cat data\n***');
console.log(data);
let parser = new xml2js.Parser();
return parser.parseString(data, function(err, imgxml) {
if (err) {
return console.log('Error parsing cat data');
} else {
let imgjson = JSON.parse(JSON.stringify(imgxml));
console.log('***We have cat JSON***');
console.log(imgjson);
catUrl = imgjson.response.data(0).images(0).image(0).url(0);
return catSource = imgjson.response.data(0).images(0).image(0).source_url(0);
}
});
});
// Event listener for the 'data' event
// In this case, accumulate all the data so we can use it all at once later
return res.روی('data', (xml) => {
return data += xml;
});
});
// Serve cat images from the CatAPI
return fs.readFile('./cats.html', function(err, cathtml) {
if (err) {
console.error(err);
return res.end('An error occurred');
}
let html = cathtml.toString()
.replace('IMGSRC', catUrl)
.replace('SOURCE', catSource);
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.write(html);
return res.end();
});
});
// Run the server
server.listen(4000);
در زیر به تفصیل وارد کد می شویم. همچنین به نظرات در کد نگاه کنید.
همانطور که از کد می بینید، درخواست ما به Cat API داده های جدید گربه را درخواست می کند. سپس به اجرای Node.js اجازه می دهیم به طور عادی ادامه یابد. با این حال، ما دو شنونده رویداد را برای مقابله با رویدادهای جدید از API راه دور متصل می کنیم. اولین مورد از اینها یک “روی پایان” شنونده رویداد. وقتی یک بار کامل cat از Cat API داشته باشیم، سپس خود را به روز می کنیم page با داده ها و تصویر جدید دسته دوم رویدادی که ما به آن گوش می دهیم رویداد “داده” است. این زمانی فعال می شود که داده های جدیدی از راه دور وجود داشته باشد host. در این صورت، دادهها را بافر میکنیم و آنها را به ذخیرهگاه دادههای موقت خود اضافه میکنیم.
اکنون، به لطف قدرت شنوندگان رویداد، دریافت تصاویر جدید گربه را به دلخواه آسان کرده ایم.
بازدیدکنندگان وب سایت ما می توانند تصاویر جدید گربه روز را با کلیک یک دکمه دریافت کنند.
رویدادها و تایمرها در Node.js بسیار بیشتر از آنچه در اینجا توضیح دادیم وجود دارد. موضوع بعدی خوب برای بررسی این است که ساطع کننده های رویداد، که به شما قدرت بیشتری در مورد انواع رویدادهایی می دهد که برنامه شما می تواند از آنها استفاده کند.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-26 13:20:04