আমি কীভাবে Node.js (জাভাস্ক্রিপ্ট) এ অপেক্ষা করতে পারি, আমার কিছু সময়ের জন্য বিরতি দেওয়া দরকার


385

আমি ব্যক্তিগত প্রয়োজনে স্ক্রিপ্টের মতো কনসোল বিকাশ করছি। আমার একটি বর্ধিত সময়ের জন্য বিরতি দিতে সক্ষম হওয়া দরকার, তবে, আমার গবেষণা থেকে, নোড.জেএসের প্রয়োজনীয়তা বন্ধ হওয়ার কোনও উপায় নেই। কিছু সময়ের পরে ব্যবহারকারীর তথ্য পড়তে অসুবিধা হচ্ছে ... আমি এখানে কিছু কোড দেখেছি, তবে আমি বিশ্বাস করি যে তাদের কাজ করার জন্য তাদের ভিতরে অন্য কোড থাকতে হবে:

setTimeout(function() {
}, 3000);

তবে সময়সীমার পরে কার্যকর করার জন্য কোডের এই লাইনটির পরে আমার সমস্ত কিছু দরকার।

উদাহরণ স্বরূপ,

//start-of-code
console.log('Welcome to My Console,');
some-wait-code-here-for-ten-seconds..........
console.log('Blah blah blah blah extra-blah');
//endcode. 

আমি ভালো জিনিস দেখেছি

yield sleep(2000);

কিন্তু নোড.জেএস এটি স্বীকৃতি দেয় না।

আমি কীভাবে এই বর্ধিত বিরতি অর্জন করতে পারি?



1
ক্রিস্টোফার অ্যালেন, সম্ভবত প্রাসঙ্গিক নয়, তবে কাজটি করেছেন: require("child_process").execSync('php -r "sleep($argv[1]);" ' + seconds);
হাইথাম স্লিলেম

নোড-ঘুম npm মডিউল কৌতুক করতে পারে (অবশ্য আমি শুধুমাত্র ডিবাগ করার জন্য এটি ব্যবহার হবে)
জুলিয়ান Soro

উত্তর:


211

এটি করার সর্বোত্তম উপায় হ'ল আপনার কোডটি একাধিক ফাংশনে বিভক্ত করা, যেমন:

function function1() {
    // stuff you want to happen right away
    console.log('Welcome to My Console,');
}

function function2() {
    // all the stuff you want to happen after that pause
    console.log('Blah blah blah blah extra-blah');
}

// call the first chunk of code right away
function1();

// call the rest of the code and have it execute after 3 seconds
setTimeout(function2, 3000);

এটি জনিএইচকে এর সমাধানের মতো, তবে আরও পরিষ্কার এবং প্রসারিত করা সহজ।


7
@ লুকাসেভারিন আপনি তখন কিছু ভুল করছেন। এটি একটি মূল নকশার প্যাটার্ন।
এলিয়ট বোনেভিল

এবং যখন আপনি কাজটি শুরু করবেন তখন কেবল একটি ফাংশন দূরে নয়, তবে কোড থেকে 10 ফাইল দূরে যা অ-সংকীর্ণকরণ করা দরকার?
সিরিল ডুচন-ডরিস

10
@ সিরিলডুচন-ডরিস কী?
আতুরস্যাম 3'17

3
কোনও মার্জিত প্রতিশ্রুতি ভিত্তিক সমাধানের জন্য @ মেশিনঘোস্টের উত্তরটি ব্যবহার করুন যা কোনও কাস্টম কোডের প্রয়োজন নেই এবং অপেক্ষা / অ্যাসিঙ্ক সমর্থন করে
ডেন ম্যাকাওল

এটি async, এর অর্থ হ'ল যদি ফাংশন 1 3 সেকেন্ডের আগে শেষ হয় তবে তারা একে অপরকে ওভারল্যাপ করা শুরু করে। তারপরে আপনি ফিরে আসতে পারবেন না এবং এটি প্রায় কখনও ব্যবহারযোগ্য নয়। আমি এখনও পর্যন্ত খুঁজে পাওয়া একমাত্র debugger;
উপায়টি

426

একটি পুরানো প্রশ্নের নতুন উত্তর। আজ ( জানুয়ারী 2017 জুন 2019) এটি অনেক সহজ। আপনি নতুন async/awaitসিনট্যাক্স ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

async function init() {
  console.log(1);
  await sleep(1000);
  console.log(2);
}

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}   

ব্যবহার করার জন্য async/awaitইনস্টল এবং প্লাগ-ইন ছাড়া বাক্সের বাইরে, আপনি নোড-v7 বা নোড-V8 ব্যবহার করতে ব্যবহার আছে --harmonyপতাকা।

জুন 2019 আপডেট করুন: নোডজেএস এর সর্বশেষতম সংস্করণ ব্যবহার করে আপনি এটিকে বাক্সের বাইরে ব্যবহার করতে পারেন। কমান্ড লাইন আর্গুমেন্ট সরবরাহ করার প্রয়োজন নেই। এমনকি গুগল ক্রোম আজও এটি সমর্থন করে।

2020 আপডেট করুন: শীঘ্রই আপনি এটি ব্যবহার করতে সক্ষম হবেনawait একটি অ্যাসিঙ্ক ফাংশনের বাইরে বাক্য গঠন । শীর্ষ উদাহরণে যেমন এই উদাহরণ

await sleep(1000)
function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
} 

প্রস্তাবটি ৩ য় পর্যায়ে রয়েছে । আপনি আজ এটি ওয়েবপ্যাক 5 (আলফা) ব্যবহার করে ব্যবহার করতে পারেন,

অধিক তথ্য:


5
আমি মনে করি আপনি awaitকীওয়ার্ডটি ভুলে গেছেনsleep(1000)
রায়ান জার্ভিস

6
এটি সত্যই উত্তর হওয়া উচিত, ঘুম নোড.জেএস প্যাকেজ ঝামেলা হতে পারে।
স্টুয়ার্ট অ্যালেন

4
প্রকৃতপক্ষে সেরা সমাধান
Kostas Siabanis

40
let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));আমার মত অনেলিক ফ্রিক্সের জন্য :)
স্টোজাদিনোভিয়

21
let sleep = require('util').promisify(setTimeout);নোড 7.6+ এ কাজ করে এবং পঠনযোগ্যতা উন্নত করে
BrianHVB

216

কোনও নির্ভরতা ছাড়াই সংক্ষিপ্ততম সমাধান:

await new Promise(resolve => setTimeout(resolve, 5000));

14
"পরিশীলনের উচ্চতা সরলতা" " - ক্লেয়ার বুথ লুস এটি এখন পর্যন্ত সেরা উত্তর, আইএমও।
আর্নল্ড

3
এটি অন্যান্য জবাবগুলির তুলনায় স্পষ্টতই সাম্প্রতিক, তবে 2018 এর মতো এটি সবচেয়ে মার্জিত যা কোডটিতে অন্য কোনও প্রভাব ছাড়াই 1 লাইনে কাজটি করে।
হারিক

1
এইটা ভালো. আপনাকে যদিও নোডজেএস 7.6.0 বা তার বেশি ব্যবহার করতে হবে। এটি পুরানো সংস্করণগুলিতে কাজ করবে না।
রায়ান শিলিংটন

5
let sleep = require('util').promisify(setTimeout);তিনটি অক্ষর দীর্ঘ তবে পুনরায় ব্যবহারযোগ্য এবং আরও পঠনযোগ্য ইমো
ব্রায়ান এইচভিবি

2
এসলিন্টের অভিযোগ এড়াতে এর resolveপরিবর্তে কল করুন done। অর্থাৎawait new Promise(resolve => setTimeout(resolve, 5000))
ড্যারেন কুক

150

setTimeoutকলব্যাকের মধ্যে বিলম্বের পরে আপনি যে কোডটি কার্যকর করতে চান তা রাখুন :

console.log('Welcome to My Console,');
setTimeout(function() {
    console.log('Blah blah blah blah extra-blah');
}, 3000);

2
এটি মারাত্মক অগোছালো এবং সাধারণত খারাপ অনুশীলন, বিশেষত যদি ওপি সেই বিলম্বের পরে বাকি প্রোগ্রামটি চালাতে চায়। আমার উত্তর দেখুন।
এলিয়ট বোনেভিল

32
@ এলিয়টবনেভিলি ধারণাটি চিত্রিত করার জন্য এটি কেবল উদাহরণ। স্পষ্টতই আপনি কোডটি অন্য কোথাও ঠিক তেমন ইনলাইন কোড ব্যবহার না করে ফাংশন কলে কল করতে পারেন (উচিত)।
জনিএইচকে

@ ক্রিস্টোফারক্যাম্প: দেখা যাচ্ছে নোড.জেএস এর এই সমাধানের একটি সমাধান রয়েছে node-fibersএটা দেখ.
এলিয়ট বোনেভিল

এটি একটি দুর্দান্ত সমাধান, বিশেষত যদি আপনি কোনও কোড সম্পাদন করতে না চান তবে আপনি কেবল একটি লুপের অভ্যন্তরে "ঘুম" পদ্ধতির নকল করতে চান। এই উদাহরণ দিয়ে কিছুই ভুল।
হাফস্টপ

এটি ক্লায়েন্টের কাছ থেকে আসা অনুরোধগুলিতে বিলম্বের জন্য উপযুক্ত, আমি ক্লায়েন্টের পক্ষ থেকে আমার লোডিং স্পিনারদের পরীক্ষা করতে এই পদ্ধতির ব্যবহার করেছি
moein rahimi

145

এটি একটি সাধারণ ব্লক করার কৌশল:

var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}

এটি ইনসোফারকে ব্লক করছে কারণ আপনার স্ক্রিপ্টে আর কিছুই ঘটবে না (কলব্যাকের মতো)। তবে এটি যেহেতু এটি একটি কনসোল স্ক্রিপ্ট তাই সম্ভবত এটি আপনার প্রয়োজন!


27
ভয়াবহ বা না, এটি একটি সাধারণ কাজ করে wait, এটি অবরোধ করে এবং এটি কিছু পরীক্ষার উদ্দেশ্যে কাজ করে। ঠিক আমি যা অনুসন্ধান করছিলাম for
ক্লিজস্টাররা

8
তৃতীয় পক্ষের libs ছাড়াই প্রশ্নের পুরোপুরি উত্তর দেয় এবং এটি সহজ। তা সত্ত্বেও লোকে বলে "ভয়ঙ্কর" .... এই ভারী CPU- র লোড ইত্যাদি Btw simulating খুব এই অনুরূপ জন্য মহান যেমন হয় phpied.com/sleep-in-javascript
ডন জন্য Cheadle

2
এছাড়াও যদি আপনি এমন কিছু অনুকরণের চেষ্টা করছেন যা ইভেন্ট লুপকে ধীর করে দেয়, এইভাবে অন্যান্য ব্যবহারকারী / সংযোগগুলিও ধীর করে দেয় this বিলম্বিত কলব্যাক যুক্ত করা অন্য ব্যবহারকারী / সংযোগগুলিতে প্রভাব ফেলবে না।
ডন চেইডল

13
এটি একটি spin-wait
মাইক অ্যাটলাস

7
@ অলি যে লক্ষ্য বলে মনে হচ্ছে।
ফলিক্স গাগনন-গ্রেনিয়ার

63

নোডে 7.6.0 বা উচ্চতর higher

নোড দেশীয়ভাবে অপেক্ষা করা সমর্থন করে:

const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));

তবে আপনি যদি অ্যাসিঙ্ক ফাংশন ব্যবহার করতে পারেন:

await sleep(10000); // sleep for 10 seconds

বা:

sleep(10000).then(() => {
  // This will execute 10 seconds from now
});

পুরানো নোড সংস্করণে (মূল উত্তর)

আমি একটি অ্যাসিঙ্ক্রোনাস ঘুম চাইছিলাম যা উইন্ডোজ ও লিনাক্সে কাজ করেছিল, দীর্ঘক্ষণ লুপের সাথে আমার সিপিইউকে ঝুলিয়ে না রেখে। আমি স্লিপ প্যাকেজটি চেষ্টা করেছি কিন্তু এটি আমার উইন্ডোজ বাক্সে ইনস্টল হবে না। আমি ব্যবহার করে শেষ করেছি:

https://www.npmjs.com/package/system-sleep

এটি ইনস্টল করতে, টাইপ করুন:

npm install system-sleep

আপনার কোডে,

var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds

একটি যাদুমন্ত্র মত কাজ করে.


1
দুর্দান্ত উত্তরের ধন্যবাদ - এটি কিছু অসম্ভব
কোডকে

1
আরও গবেষণার উপর এই মডিউলটি ডিসেইনসেকের উপর নির্ভর করে যা অন্য একটি ডিসাইঙ্ক গিথুব রেপো থেকে তৈরি for আসল রেপো হ্যাক হওয়ায় এটি ব্যবহার না করার জন্য সতর্ক করে। এটি কাজ করে তবে সমস্ত প্ল্যাটফর্মে নয় তাই আপনার যদি ক্রস প্ল্যাটফর্ম সমাধানের প্রয়োজন হয় তবে এটিকে এড়াতে পারেন।
danday74

1
হ্যাঁ, আমি এর সাথে প্রবসের অভিজ্ঞতা কখনও পাই নি এবং দেবের জন্য এটি দুর্দান্ত - আমি বিশ্বাস করি যে এটি সি বা সি ++ এর উপর নির্ভর করে যা বহুলভাবে পাওয়া যায় তবে আমি অনুমান করি যে এটি কিছু মেশিনে নেই এবং এটি ব্যর্থ হয় যার কারণেই এটি সমস্যার কারণ হয় it - যদি এটি সিস্টেমে ব্যর্থ হয় তবে ঘুম আবার একটি স্পিন
ওয়েটে

1
এই প্যাকেজটি ম্যাক ওএসে কাজ করে না, এবং তাই ক্রস সামঞ্জস্যপূর্ণ নয়, এবং তাই কার্যকর হয় না। দেখুন github.com/jochemstoel/nodejs-system-sleep/issues/4
nuzzolilo

1
পছন্দ করুন ম্যাক ওএসে আমাদের একজন বিকাশকারী আছে এবং সে কখনও কোনও ভুলের কথা উল্লেখ করেনি। আমি সন্দেহ করি এটি একটি নির্দিষ্ট ম্যাক ওএস সংস্করণ। আমি এই উত্তরটিও আপডেট করেছি যেহেতু ঘুম মূলত নোডজেএস এর নতুন সংস্করণগুলিতে অন্তর্নির্মিত।
রায়ান শিলিংটন

62

আধুনিক জাভাস্ক্রিপ্ট ব্যবহার করে সাধারণ এবং মার্জিত ঘুমের ফাংশন

function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

কোনও নির্ভরতা নেই, কোনও কলব্যাক নরক নেই; এটাই :-)


প্রশ্নে প্রদত্ত উদাহরণ বিবেচনা করে, আমরা দুটি কনসোল লগের মধ্যে এভাবেই ঘুমাব:

async function main() {
    console.log("Foo");
    await sleep(2000);
    console.log("Bar");
}

main();

"ব্যর্থতা" হ'ল এখন আপনার মূল ফাংশনটিও asyncপাশাপাশি হওয়া উচিত। তবে আপনি বিবেচনা করছেন যে আপনি ইতিমধ্যে আধুনিক জাভাস্ক্রিপ্ট কোডটি লিখছেন, আপনি সম্ভবত (বা কমপক্ষে হওয়া উচিত!) আপনার কোড async/ awaitসমস্ত ব্যবহার করছেন , সুতরাং এটি সত্যিই কোনও সমস্যা নয়। সমস্ত আধুনিক ব্রাউজার আজ সমর্থন করে এটি করে।

sleepযেগুলি অভ্যস্ত নয় async/awaitএবং ফ্যাটযুক্ত অ্যারো অপারেটরদের জন্য ফাংশনটিতে কিছুটা অন্তর্দৃষ্টি দেওয়া , এটি এটি লেখার ভারবজিক পদ্ধতি:

function sleep(millis) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { resolve(); }, millis);
    });
}

চর্বিযুক্ত তীর অপারেটর ব্যবহার করে, এটি আরও ছোট (এবং আরও মার্জিত) করে তোলে।


1
আপনি ঘুমের ক্রিয়াটি ছাড়া asyncএবং সমস্ত কিছু একইরকম রেখেও লিখতে পারেন । asyncযদিও এটি সম্ভবত পরিষ্কার হয় ।
কেভিন পেনা

কেভেনপিয়াকে ভাল করে ধরুন। প্রকৃতপক্ষে, আমি মনে করি আমি এটি ছাড়া পছন্দ করি async। আপনার পরামর্শ দিয়ে আমার উত্তর সম্পাদনা। আমি মনে করি না যে এটি কোডটি আরও পরিষ্কার করে দেয়; তার জন্য, আমি পরিবর্তে জেএসডোক অবলম্বন করব।
লুসিও পাইভা

8
আমি আমার স্ক্রিপ্টগুলিতে নিম্নলিখিত ওয়ান-লাইনার রাখতে পছন্দ করি:const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
কোরিয়া

46

আপনি এই www.npmjs.com / প্যাকেজ / ঘুম ব্যবহার করতে পারেন

var sleep = require('sleep');
sleep.sleep(10); // sleep for ten seconds

4
এটা কাজ করে জরিমানা MacOS, কিন্তু এটা ত্রুটি সম্মুখীন CentOSকারণে node_gyp ত্রুটি । এটা পোর্টেবল মনে হয় না।
এচলোইউ

1
সম্ভবত ওএস দ্বারা নয়, নোড বিল্ড দ্বারা সমস্যা হয়েছে
আলেকসেজ

34

এই প্রশ্নটি বেশ পুরানো, তবে সম্প্রতি ভি 8 জেনারেটর যুক্ত করেছে যা ওপি অনুরোধ করে তা পূরণ করতে পারে। জেনারেটরগুলি স্থগিতকরণ বা জেন-রানের মতো লাইব্রেরির সহায়তায় অ্যাসিঙ্ক ইন্টারঅ্যাকশনগুলির জন্য ব্যবহার করা সহজ ।

স্থগিত ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হয়েছে:

suspend(function* () {
    console.log('Welcome to My Console,');
    yield setTimeout(suspend.resume(), 10000); // 10 seconds pass..
    console.log('Blah blah blah blah extra-blah');
})();

সম্পর্কিত পড়া (নির্লজ্জ স্ব-প্রচারের পথে): জেনারেটরগুলির সাথে বড় চুক্তি কী?


2
উত্তম উত্তর - তবে পড়তে হবেyield setTimeout(suspend.resume(), 10000);
এডহবেল

1
ধন্যবাদ, @ এডহাবেল এই উত্তরটি স্থগিতের খুব পুরানো সংস্করণের ভিত্তিতে তৈরি হয়েছিল তবে আপনি সর্বশেষ সম্পর্কে সঠিক। আমি উত্তর আপডেট করব।
jmar777

নোডের এটি কোন সংস্করণের জন্য?
danday74

1
@ ডানডায় 74৪ আমি আন-ফ্ল্যাগ করা ঠিক কখনই স্মরণ করতে পারি না, তবে তারা পতাকাটির পিছনে v0.12 সাল থেকে প্রায় ছিল --harmonyএবং নোডএরপ্রেণ অনুসারে, v4.8.4 থেকে এগুলি কোনও পতাকা ছাড়াই কমপক্ষে উপলভ্য: node.green/#ES2015-funitions-generators-basic-functionality । তবে দয়া করে নোট করুন যে আরও নতুন async/awaitলাইব্রেরির মতো প্রয়োজন ছাড়া নতুন সিনট্যাক্স এটির আরও ভাল সমাধান সরবরাহ করে suspend। উদাহরণস্বরূপ এই উত্তরটি দেখুন: stackoverflow.com/a/41957152/376789 । V7.10 থেকে অ্যাসিঙ্ক ফাংশনগুলি (পতাকা ছাড়াই) উপলব্ধ।
jmar777

20

লিনাক্স / নোডেজে এটি আমার পক্ষে কাজ করে:

কনস্ট স্পোনসিঙ্ক = প্রয়োজন ('চাইল্ড_প্রসেস') sp

var ঘুম = স্পোনসিঙ্ক ('ঘুম', [1.5]);

এটি অবরুদ্ধ করছে, তবে এটি একটি ব্যস্ত অপেক্ষা লুপ নয়।

আপনি যে সময়টি নির্দিষ্ট করেছেন তা সেকেন্ডের মধ্যে তবে ভগ্নাংশ হতে পারে। আমি জানি না অন্য ওএসেরও একই কমান্ড রয়েছে কিনা।


sleepপ্রায় কাছাকাছি সর্বত্র বিরাজমান এবং তাড়াতাড়ি ইউনিক্স দিন থেকে একটি utiltiy চারপাশে হয় en.wikipedia.org/wiki/Sleep_%28Unix%29 । কেবল "বিরল নয়" ওএস এর সম্ভবত অস্তিত্বই থাকবে না উইন্ডোজ (তবে সেখানে আপনি চেষ্টা করতে পারেনchild_process.spawnSync('timeout', ['/T', '10'])
মানবতাঅ্যান্ডপিস

17

আপনি যদি "কোড গল্ফ" করতে চান তবে আপনি এখানে অন্যান্য উত্তরগুলির একটি সংক্ষিপ্ত সংস্করণ তৈরি করতে পারেন:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

তবে সত্যিই আমার মতে আদর্শ উত্তর হ'ল নোডের utilগ্রন্থাগার এবং তার promisifyফাংশনটি ব্যবহার করুন যা ঠিক এই ধরণের জিনিসটির জন্য ডিজাইন করা হয়েছে (পূর্বে বিদ্যমান অ-প্রতিশ্রুতি-ভিত্তিক স্টাফের প্রতিশ্রুতি-ভিত্তিক সংস্করণ তৈরি করা):

const util = require('util');
const sleep = util.promisify(setTimeout);

উভয় ক্ষেত্রেই আপনি awaitনিজের sleepফাংশনটি কল করে কেবল বিরতি দিতে পারেন :

await sleep(1000); // sleep for 1s/1000ms

আসলে, use.promisify ব্যবহার করে কলব্যাক না দিয়ে ঘুম কল করা সম্ভব নয়। nodejs.org/api/…
Howie

1
তোমাকে মিস করছি await। এটি ধরণের কলব্যাক তৈরি করে, জিনিসগুলিতে বিরতি দেয় এবং সেই কলব্যাক ফিরে আসার পরে কোডটি পুনরায় আরম্ভ করে। কলব্যাকটি একটি মান সহ ফিরে আসে, তবে আমরা এই ক্ষেত্রে এটির যত্ন নিই না, তাই বামদিকে কিছুই নেই await
মেশিনঘস্ট

1
কোড গল্ফকে ওয়াইন করার জন্য এটি এক লাইনে লিখুন;) কনড স্লিপ = প্রয়োজনীয় ('ব্যবহার')। প্রতিশ্রুতিবদ্ধ (সেটটাইমআউট);
ফ্যাবিয়ান

14

আমি সম্প্রতি ওয়েট নামে সহজ বিমূর্ততা তৈরি করেছি sy সিঙ্ক মোডে অ্যাসিঙ্ক ফাংশনগুলি কল করতে (নোড-ফাইবারের উপর ভিত্তি করে)। আসন্ন ES6 জেনারেটরের উপর ভিত্তি করে একটি সংস্করণও রয়েছে।

https://github.com/luciotato/waitfor

অপেক্ষা. for ব্যবহার করে , আপনি নোডের ইভেন্ট লুপটিকে অবরুদ্ধ না করে কোনও মানক নোডজেজ অ্যাসিঙ্ক ফাংশনটিকে কল করতে পারেন, যেন এটি কোনও সিঙ্ক ফাংশন।

আপনার যখন প্রয়োজন হয় তখন আপনি ক্রমান্বয়ে কোড করতে পারেন, এটি হ'ল (আমি অনুমান করছি) ব্যক্তিগত ব্যবহারের জন্য আপনার স্ক্রিপ্টগুলি সহজ করার জন্য নিখুঁত।

ব্যবহার wait.for আপনার কোড হবে:

require('waitfor')

..in a fiber..
//start-of-code
console.log('Welcome to My Console,');
wait.miliseconds(10*1000); //defined in waitfor/paralell-tests.js - DOES NOT BLOCK
console.log('Blah blah blah blah extra-blah');
//endcode. 

এছাড়াও যে কোনও অ্যাসিঙ্ক ফাংশন সিঙ্ক মোডে কল করা যেতে পারে । উদাহরণগুলি পরীক্ষা করুন।


TypeError: Object #<Object> has no method 'miliseconds'
ক্যাফিনএডিকশন

মন্তব্যে বলা হয়েছে: "// ওয়েটফোর / প্যারােল-টেস্ট.জেএস সংজ্ঞায়িত" এটি ফাইল থেকে দখল করে।
লুসিও এম টাটো

2
আমার কাছ থেকে এটি পাওয়ার পরে আমি wait.for/paralell-tests.jsঅপরিজ্ঞাত বৈশিষ্ট্য সম্পর্কিত ইত্যাদি সম্পর্কিত আরও একটি ত্রুটির মুখোমুখি হয়েছি So সুতরাং সেগুলিও আমার অনুলিপি করা দরকার। আপনি কোডটি এমনভাবে সাজান না কেন যাতে এটির প্রয়োজন হয় না?
ব্যবহারকারী 907860

ওয়েট.ফোর এবং অন্যান্য ফাইবার সলিউশনগুলি আমার কাছে পুরো নতুন পৃথিবী খুলে দিয়েছে! আমি পারলে এই মিলিয়ন বার ভোট দিতে পারতাম। যদিও নোডেজ সম্প্রদায়ের বেশিরভাগ অংশ তন্তুগুলির বিরোধিতা করে, তবে আমি মনে করি যে তারা একটি দুর্দান্ত সংযোজন এবং কলব্যাকের নরকের ক্ষেত্রে এটির অবশ্যই স্থান রয়েছে।
লেভি রবার্টস

7

যেহেতু জাভাস্ক্রিপ্ট ইঞ্জিন (ভি 8) ইভেন্ট-সারিতে ইভেন্টগুলির ক্রম অনুসারে কোড চালায়, জাভাস্ক্রিপ্ট নির্দিষ্ট সময় পরে কার্যকরভাবে ট্রিগার করবে এমন কোনও কঠোরতা নেই। এটি হ'ল, যখন আপনি কোডটি পরে চালাতে কয়েক সেকেন্ড সেট করেন, ট্রিগার কোডটি খালি ইভেন্টের সারিতে ক্রমের ভিত্তিতে থাকে। সুতরাং কোড কার্যকর করতে ট্রিগার করতে নির্দিষ্ট সময়ের চেয়ে বেশি সময় লাগতে পারে।

নোড.জেস অনুসরণ করে,

process.nextTick()

পরে কোডটি চালানোর পরিবর্তে সেটটাইমআউট () সেট করুন। উদাহরণ স্বরূপ,

process.nextTick(function(){
    console.log("This will be printed later");
});

2

ES6 সমর্থনকারীগুলির সাহায্যে Promiseআমরা কোনও তৃতীয় পক্ষের সহায়তা ছাড়াই তাদের ব্যবহার করতে পারি।

const sleep = (seconds) => {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, (seconds * 1000));
    });
};

// We are not using `reject` anywhere, but it is good to
// stick to standard signature.

তারপরে এটি ব্যবহার করুন:

const waitThenDo(howLong, doWhat) => {
    return sleep(howLong).then(doWhat);
};

নোট করুন যে doWhatফাংশনটি resolveকলটির মধ্যে কলব্যাক হয়ে যায় new Promise(...)

আরও মনে রাখবেন যে এটি ASYNCHRONOUS ঘুম। এটি ইভেন্টের লুপটিকে অবরুদ্ধ করে না। আপনার যদি ঘুম অবরুদ্ধ করার প্রয়োজন হয় তবে এই লাইব্রেরিটি ব্যবহার করুন যা সি ++ বাইন্ডিংয়ের সাহায্যে ঘুমকে ব্লক করে real (যদিও অ্যাসিঙ্ক পরিবেশের মতো নোডে ব্লকিং ঘুমের প্রয়োজন খুব কম)

https://github.com/erikdubbelboer/node-sleep


1
let co = require('co');
const sleep = ms => new Promise(res => setTimeout(res, ms));

co(function*() {
    console.log('Welcome to My Console,');
    yield sleep(3000);
    console.log('Blah blah blah blah extra-blah');
});

উপরের এই কোডটি জাভাস্ক্রিপ্টের অ্যাসিনক্রোনাস কলব্যাক নরকের সমস্যার সমাধান করার পার্শ্ব প্রতিক্রিয়া। এই কারণেই আমি মনে করি যে জাভাস্ক্রিপ্টটিকে ব্যাকএন্ডে একটি দরকারী ভাষা করে তোলে। আসলে এটি আমার মতে আধুনিক জাভাস্ক্রিপ্টের সাথে প্রবর্তিত সবচেয়ে আকর্ষণীয় উন্নতি। এটি কীভাবে কাজ করে তা জেনারেটর কীভাবে কাজ করে তা সম্পূর্ণভাবে বোঝার প্রয়োজন। functionশব্দ একটি দ্বারা অনুসরণ *আধুনিক জাভাস্ক্রিপ্ট একটি উত্পাদক ফাংশন বলা হয়। coজেনারেটর চালানোর জন্য এনপিএম প্যাকেজ একটি রানার ফাংশন সরবরাহ করে।

মূলত জেনারেটর ফাংশন yieldকীওয়ার্ড সহ কোনও ক্রিয়াকলাপের কার্যকারিতা বিরতি দেওয়ার একটি উপায় সরবরাহ করেছিল, একই সময়ে, yieldএকটি জেনারেটর ফাংশনে জেনারেটরের এবং কলারের মধ্যে তথ্য বিনিময় সম্ভব করে তোলে। এটি কলকারীকে promiseএকটি অ্যাসিনক্রোনাস কল থেকে একটি থেকে ডেটা উত্তোলন এবং সমাধান করা ডেটা জেনারেটরে ফেরত দেওয়ার জন্য একটি ব্যবস্থা সরবরাহ করে provided কার্যকরভাবে, এটি একটি অ্যাসিঙ্ক্রোনাস কলকে সিঙ্ক্রোনাস করে।


যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
ডোনাল্ড ডাক

ধন্যবাদ @ ডোনাল্ডডাক আমার উত্তরের কোডটি সম্ভবত জাভাস্ক্রিপ্টের উন্নতির সবচেয়ে উত্তেজনাপূর্ণ অংশ। আমি এত বিস্মিত হয়েছি যে কিছু সুপার স্মার্ট ব্যক্তি কলব্যাক হেল সমস্যাটি সমাধান করার জন্য এই উপায় সম্পর্কে ভাবেন।
কিয়ান চেন

1

এটি @ atlex2 দ্বারা প্রস্তাবিত নোংরা ব্লকিং পদ্ধতির উপর ভিত্তি করে একটি মুহুর্তের জন্য স্বাদযুক্ত মডিউল । এটি কেবল পরীক্ষার জন্য ব্যবহার করুন

const moment = require('moment');

let sleep = (secondsToSleep = 1) => {
    let sleepUntill = moment().add(secondsToSleep, 'seconds');
    while(moment().isBefore(sleepUntill)) { /* block the process */ }
}

module.exports = sleep;

0

যদি কেবল পরীক্ষার উদ্দেশ্যে আপনাকে স্থগিত করতে হয় তবে আপনার বর্তমান থ্রেড এক্সিকিউশনটি এটি ব্যবহার করে দেখুন:

function longExecFunc(callback, count) {

    for (var j = 0; j < count; j++) {
        for (var i = 1; i < (1 << 30); i++) {
            var q = Math.sqrt(1 << 30);
        }
    }
    callback();
}
longExecFunc(() => { console.log('done!')}, 5); //5, 6 ... whatever. Higher -- longer

0

সহজ কিছু ঘটনা ঘটতে আমরা 5 সেকেন্ড অপেক্ষা করতে যাচ্ছি (এটি কোডের অন্য কোথাও সত্য রূপে সম্পন্ন ভেরিয়েবল দ্বারা নির্দেশিত হবে) বা সময়সীমা শেষ হওয়ার পরে আমরা প্রতি 100ms পরীক্ষা করব

    var timeout=5000; //will wait for 5 seconds or untildone
    var scope = this; //bind this to scope variable
    (function() {
        if (timeout<=0 || scope.done) //timeout expired or done
        {
            scope.callback();//some function to call after we are done
        }
        else
        {
            setTimeout(arguments.callee,100) //call itself again until done
            timeout -= 100;
        }
    })();

0

কিছু লোকের জন্য, গৃহীত উত্তরটি কাজ করছে না, আমি এই অন্য উত্তরটি পেয়েছি এবং এটি আমার জন্য কাজ করছে: আমি কীভাবে একটি সেটটাইমআউট () কলব্যাকটিতে প্যারামিটারটি পাস করতে পারি?

var hello = "Hello World";
setTimeout(alert, 1000, hello); 

'হ্যালো' হ'ল প্যারামিটারটি পাস হচ্ছে, আপনি সময়সীমার পরে সমস্ত প্যারামিটারগুলি পাস করতে পারবেন। উত্তরের জন্য @ ফ্যাবিও পিএমএসকে ধন্যবাদ


0

এই সমস্ত সেটটাইমআউট, ঘুম এবং অন্যান্য অনেক কিছুই না করে ব্যবহার করা আরও ভাল

const delay = require('delay');
await delay(2000); // will wait for 2 seconds before executing next line of code

'বিলম্ব' কী তা আপনি ব্যাখ্যা করতে পারেন এবং এর ডক্সের সাথে লিঙ্ক করতে পারেন? কেন এটা ভাল?
বালক

-2

অন্য উত্তরগুলি দুর্দান্ত তবে আমি ভেবেছিলাম আমি অন্য কোনও কৌশল গ্রহণ করব।

আপনি যদি সত্যিই সন্ধান করছেন সমস্ত কিছু যদি লিনাক্সের একটি নির্দিষ্ট ফাইলকে ধীর করে দেয়:

 rm slowfile; mkfifo slowfile; perl -e 'select STDOUT; $| = 1; while(<>) {print $_; sleep(1) if (($ii++ % 5) == 0); }' myfile > slowfile  &

নোড মাইপ্রোগ স্লোফিল

এটি প্রতি পাঁচ লাইনে 1 সেকেন্ড ঘুমাবে। নোড প্রোগ্রামটি লেখকের মতো ধীরে চলে যাবে। যদি এটি অন্য কাজ করে তবে তারা স্বাভাবিক গতিতে চালিয়ে যাবে।

Mkfifo একটি প্রথম প্রথম ইন-পাইপ তৈরি করে। এটিই এই কাজটি করে। পার্ল লাইন আপনার ইচ্ছা মতো দ্রুত লিখবে write $ | = 1 বলছে আউটপুট বাফার করবেন না।


-3

আমি এই প্রশ্নের উত্তরগুলি পড়ার পরে একসাথে রেখেছি, একটি সাধারণ ক্রিয়া যা একটি কলব্যাকও করতে পারে, আপনার যদি এটির প্রয়োজন হয়:

function waitFor(ms, cb) {
  var waitTill = new Date(new Date().getTime() + ms);
  while(waitTill > new Date()){};
  if (cb) {
    cb()
  } else {
   return true
  }
}

-4

আরও তথ্যের জন্য

yield sleep(2000); 

আপনার রেডাক্স-সাগা পরীক্ষা করা উচিত । তবে এটি আপনার মডেল কাঠামো হিসাবে রেডাক্সের পছন্দের সাথে সুনির্দিষ্ট (যদিও কঠোরভাবে প্রয়োজনীয় নয়)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.