خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

چگونه می توان اجرا را در برنامه Node.js متوقف کرد

معرفی مکث در کد جاوا اسکریپت آنقدرها هم که فکر می کنید آسان نیست. باید در استفاده از setTimeout() مراقب باشید، اما await می تواند کمک کند.

برخلاف سایر زبان های برنامه نویسی، جاوا اسکریپت روش خواب داخلی ندارد. بنابراین نمی توانید به سادگی یک تابع sleep() را برای مکث یک برنامه Node.js فراخوانی کنید. با این حال، راه‌های دیگری وجود دارد که می‌توانید برنامه را برای مدت زمان مشخصی منتظر بمانید.

این آموزش سه رویکرد را مورد بحث قرار می‌دهد: setTimeout، async/wait، و بسته sleep-promise.

استفاده از setTimeout() برای منتظر ماندن برای یک زمان خاص

تابع setTimeout () کد را برای زمان اجرا برنامه ریزی می کند تا پس از گذشت زمان مشخصی اجرا شود. تابع و زمان تاخیر را بر حسب میلی ثانیه می پذیرد. در اینجا نحو است:

setTimeout(function(), timeInMs)

به عنوان مثال، فرض کنید تابعی دارید که روی کنسول چاپ می شود:

function printSentence() {
    console.log("Using setTimeout()")
}

برای اجرای تابع فوق پس از گذشت دو ثانیه، تابع و زمان تاخیر 2000 میلی ثانیه را به تابع setTimeout() منتقل کنید:

setTimeout(printSentence, 2000)

در حالی که این کار می کند، تضمین نمی شود که عملکرد شما دقیقاً بعد از دو ثانیه اجرا شود. قطعا حداقل این مقدار زمان می برد، اما ممکن است بیشتر طول بکشد.

آیا setTimeout() دقیق است؟

بله، اما با برخی احتیاط ها. setTimeout() یک تابع جاوا اسکریپت ناهمزمان است که به این معنی است که مسدود نیست. کدی که برنامه ریزی می کنید به حلقه رویداد اضافه می شود در حالی که بقیه برنامه شما ادامه دارد.

مطلب مرتبط:   نحوه تشخیص و تشخیص پلاک خودرو با استفاده از پایتون

پس از سپری شدن زمان تاخیر، برنامه شما کد برنامه ریزی شده را اجرا می کند، اما فقط زمانی که آزاد باشد. اگر کد دیگری در پشته تماس باشد، ابتدا اجرا می شود، حتی اگر کد برنامه ریزی شده اجرا شود. این جایی است که زمان تاخیر اضافی ممکن است رخ دهد، از این رو عدم دقت.

برنامه زیر را در نظر بگیرید.

console.log("Hello World!")
 
function printSentence() {
    console.log("Using setTimeout()")
}
 
setTimeout(printSentence, 2000)
console.log("Done")

در اینجا چیزی است که کنسول هنگام اجرای آن نمایش می دهد:

Hello World!
Done
Using setTimeout()

این برنامه یک تاخیر معرفی می کند، اما فقط کدی را که به setTimeout() ارسال می کند به تاخیر می اندازد. بقیه برنامه ادامه می‌یابد و کد برنامه‌ریزی‌شده فقط پس از سپری شدن مدت زمان آن را قطع می‌کند. اگر می خواهید همه این کدها را به ترتیب اجرا کنید، با یک مکث در وسط، استفاده از setTimeout () کار نخواهد کرد.

یکی از جایگزین ها نوشتن کدهای همزمان است که اجرا را تا زمانی که نیاز دارید مسدود می کند. برای مثال، می‌توانید از یک حلقه do…while برای مسدود کردن رشته اجرا تا زمانی که زمان تاخیر تمام شود استفاده کنید:

function delay(ms) {
    const date = Date.now();
    let currentDate = null;
 
    do {
        currentDate = Date.now();
    } while (currentDate - date < ms);
}
 
console.log("Hello World");
delay(2000);
console.log("Will be printed after 2 seconds!");

تابع delay() تا زمانی که زمان فعلی برابر یا بیشتر از زمان شروع آن به اضافه تاخیر شود، حلقه می زند. نقطه ضعف این رویکرد این است که CPU فشرده است، به خصوص با تاخیرهای زیاد. حلقه do…while باید زمان باقی مانده پس از هر میلی ثانیه را محاسبه کند.

مطلب مرتبط:   اصول Angular: نحوه اضافه کردن مسیریابی

استفاده از Async/Await برای به تاخیر انداختن برنامه Node.js

عبارت await باعث می‌شود که اجرا متوقف شود تا زمانی که یک Promise حل شود. این به شما امکان می دهد تا کد ناهمزمان را به گونه ای اجرا کنید که گویی همزمان است، اما کارآمدتر از مسدود کردن دستی اجرا. شما فقط می توانید از انتظار در داخل یک تابع با علامت غیر همگام استفاده کنید.

function delay(time) {
    return new Promise(resolve => setTimeout(resolve, time));
}
 
async function printSentence() {
    console.log("Hello World")
    await delay(2000);
    console.log("Will be printed after 2 seconds");
}
 
printSentence();

این هم خروجی برنامه بالا:

Hello World
Will be printed after 2 seconds

استفاده از بسته خواب-وعده

بسته sleep-promise روند توقف برنامه های Node.js را ساده می کند. فقط باید آن را فراخوانی کنید و زمان تاخیر را بر حسب میلی ثانیه مشخص کنید.

با نصب آن از طریق npm شروع کنید:

npm install sleep-promise

در اینجا مثالی از نحوه استفاده از آن در برنامه خود آورده شده است:

const sleep = require('sleep-promise');
 
(async () => {
    console.log("Hello World.");
    await sleep(2000);
    console.log("Will be printed after two seconds.");
})();

هنگامی که برنامه را اجرا می کنید، خروجی به صورت زیر خواهد بود.

Hello World.
Will be printed after two seconds.

انتخاب یک رویکرد مناسب

پیاده سازی یک عملکرد خواب در Node.js می تواند مشکل باشد. زمانی که تصمیم می گیرید چگونه در مورد آن پیش بروید، در نظر بگیرید که می خواهید به چه چیزی برسید. اگر فقط می خواهید مقداری کد را به تعویق بیندازید، برای حداقل زمان، setTimeout () گزینه خوبی است. اما اگر می خواهید اجرای کل برنامه خود را متوقف کنید، باید از async/wait استفاده کنید.

مطلب مرتبط:   نحوه اعتبارسنجی جزئیات حساب کاربری با استفاده از عبارات منظم