ঘুমের জাভাস্ক্রিপ্ট সংস্করণ কী ()?


2333

sleepনিম্নলিখিত pausecompফাংশন ( এখান থেকে নেওয়া ) এর চেয়ে জাভাস্ক্রিপ্টে ইঞ্জিনিয়ার করার আরও ভাল উপায় কি আছে ?

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); }
    while(curDate-date < millis);
}

এটি জাভাস্ক্রিপ্টে ঘুমের সদৃশ নয় - ক্রিয়াগুলির মধ্যে বিলম্ব ; আমি কোনও ক্রিয়াকলাপের মাঝখানে সত্যিকারের ঘুম চাই, এবং কোনও অংশের কোড কার্যকর করার আগে আর দেরি করব না।


4
এটি কিছুক্ষণের মাঝামাঝি সময়ে সেট করতে হবে, যদি আমি সেটটাইমআউট ব্যবহার করি তবে সেগুলি আরও সেটটাইমআউটগুলি প্রক্রিয়া অবধি চালিয়ে যাবে এবং অবশেষে একই সময়ে চলবে এবং নিজেদের মধ্যে কিছুটা সমঝোতা তৈরি করবে
fmsf

158
এটি একটি ভয়াবহ সমাধান - আপনি কিছুই না করার সময় প্রক্রিয়াকরণ চক্রের চিবিয়ে চলতে চলেছেন।
17

12
ঘুমের একমাত্র উদ্দেশ্য হ'ল ভোটদান বা কলব্যাকের জন্য অপেক্ষা করা - সেটইন্টারওয়াল এবং সেটটাইমআউট উভয়ের চেয়ে ভাল করে।
অন্নাকাটা

1
সম্ভবত আপনি জাভাস্ক্রিপ্টে ধারাবাহিকতা পাস করার শৈলীতে যা চান তা করতে পারেন। এই নিবন্ধটি
অগ্নিয়ান দিমিত্রভ

উত্তর:


2558

2017 - 2019 আপডেট

২০০৯ সাল থেকে যখন এই প্রশ্ন জিজ্ঞাসা করা হয়েছিল, জাভাস্ক্রিপ্ট উল্লেখযোগ্যভাবে বিকশিত হয়েছে। অন্যান্য সমস্ত উত্তর এখন অপ্রচলিত বা অত্যধিক জটিল। এখানে বর্তমান সেরা অনুশীলন:

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

async function demo() {
  console.log('Taking a break...');
  await sleep(2000);
  console.log('Two seconds later, showing sleep in a loop...');

  // Sleep in loop
  for (let i = 0; i < 5; i++) {
    if (i === 3)
      await sleep(2000);
    console.log(i);
  }
}

demo();

এই হল. await sleep(<duration>)

বা ওয়ান-লাইনার হিসাবে:

await new Promise(r => setTimeout(r, 2000));

মনে রাখবেন যে,

  1. awaitকেবলমাত্র asyncকীওয়ার্ডের উপসর্গযুক্ত ফাংশনগুলিতে বা কিছু পরিবেশে আপনার স্ক্রিপ্টের শীর্ষ স্তরে (যেমন Chrome দেবটুলস কনসোল বা রুনকিট) সম্পাদন করা যেতে পারে।
  2. awaitকেবলমাত্র বর্তমান asyncক্রিয়াকে বিরতি দেয়

দুটি নতুন জাভাস্ক্রিপ্ট বৈশিষ্ট্য এই "ঘুম" ফাংশনটি লিখতে সহায়তা করেছে:

সঙ্গতি

কিছু অদ্ভুত কারণে আপনি নোড পুরোনো 7 (যা পৌঁছেছে ব্যবহার করছেন যদি জীবনের শেষ ), অথবা পুরানো ব্রাউজারগুলি লক্ষ্য করে করা হয়, async/ awaitএখনও মাধ্যমে ব্যবহার করা যেতে পারে হট্টগোল (করবে একটি হাতিয়ার transpile প্লেইন পুরোনো জাভাস্ক্রিপ্ট জাভাস্ক্রিপ্ট + নতুন বৈশিষ্ট্য) সঙ্গে transform-async-to-generatorপ্লাগইন।


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

18
এটির জন্য বর্তমান ব্রাউজার সমর্থন কী? যতক্ষণ না এই সমাধানটি ব্রাউজারের বিশাল সংখ্যাগুরু বা কমপক্ষে সাধারণ সকলের দ্বারা সমর্থিত হয় ততক্ষণ আমি পূর্ববর্তী সমাধানগুলি "অপ্রচলিত" হিসাবে বিবেচনা করব না। বিপরীতে, আমি এই সমাধানটিকে আকর্ষণীয় তবে অব্যবহারযোগ্য / অযৌক্তিক বিবেচনা করব যতক্ষণ না এর ব্যাপক সমর্থন না পাওয়া যায়।
অ্যালভিন থম্পসন

74
এটি "আসল ঘুম" নয় এবং প্রশ্নের উত্তর দেয় না। যে ব্যক্তি জিজ্ঞাসা করেছিল সে স্ট্যাকওভারফ্লো . com/ প্রশ্নস / 8৫৮68৮৮ / স্লিপ ইন ইন জাভাস্ক্রিপ্ট এবং তার প্রশ্নের মধ্যে একটি স্পষ্ট পার্থক্য তৈরি করেছে । আসল ঘুমে অন্য কোনও কোড কার্যকর করা যায় না (অন্য থ্রেড ব্যতীত)। এই উত্তর অন্যান্য প্রশ্নের জন্য ভাল।
নিরি

4
@ জ্যাক্রো - ট্রান্সপ্লারার তীরের কাজগুলি পরিচালনা করে পাশাপাশি অ্যাসিঙ্ক / অপেক্ষায় থাকে (যার ফলে আইই কোনওভাবে রক্ত ​​বমি করতে পারে)
জারোমন্ডা এক্স

11
@ প্রাথমিক জাভাস্ক্রিপ্ট, একক থ্রেডযুক্ত ভাষা হওয়ায় এটি "সত্যিকারের" ঘুমের পক্ষে উপযুক্ত নয় কারণ এটি ইউআই হিসাবে একই থ্রেডে চলে এবং এতে প্রতিক্রিয়াহীন ওয়েব পৃষ্ঠাগুলির কারণ হতে পারে।
প্যাট্রিক রবার্টস

849

( ২০১ for সালের আপডেট হওয়া উত্তর দেখুন )

আমি মনে করি কোনও ক্রিয়া সম্পাদন করতে, অপেক্ষা করতে, এবং অন্য ক্রিয়া সম্পাদন করতে চাওয়া পুরোপুরি যুক্তিসঙ্গত। আপনি যদি বহু-থ্রেডযুক্ত ভাষাগুলিতে লিখতে অভ্যস্ত হন, আপনার থ্রেডটি জাগ্রত না হওয়া পর্যন্ত সম্ভবত একটি নির্দিষ্ট সময়ের জন্য মৃত্যুদণ্ড কার্যকর করার ধারণা রয়েছে।

এখানে সমস্যাটি হচ্ছে জাভাস্ক্রিপ্টটি একক থ্রেড ইভেন্ট-ভিত্তিক মডেল। একটি নির্দিষ্ট ক্ষেত্রে, পুরো ইঞ্জিনটি কয়েক সেকেন্ড অপেক্ষা করা ভাল লাগবে, সাধারণভাবে এটি খারাপ অভ্যাস। মনে করুন আমি নিজের লেখার সময় আপনার ফাংশনগুলি ব্যবহার করতে চাইছি? আমি যখন আপনার পদ্ধতিটি কল করি তখন আমার পদ্ধতিগুলি সমস্ত স্থির হয়ে যায়। জাভাস্ক্রিপ্ট যদি কোনওভাবে আপনার ফাংশনটির সম্পাদন প্রসঙ্গে সংরক্ষণ করতে পারে তবে এটিকে কোথাও সঞ্চয় করে রাখুন, তারপরে এটি ফিরিয়ে আনুন এবং পরে চালিয়ে যেতে পারেন, তবে ঘুম হতে পারে, তবে এটি মূলত থ্রেডিং হবে।

সুতরাং অন্যরা যে পরামর্শ দিয়েছে তার সাথে আপনি বেশ আটকে আছেন - আপনাকে আপনার কোডটি একাধিক ফাংশনে বিভক্ত করতে হবে।

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


45
এটি মোটেই সঠিক উত্তর নয়। জাভাস্ক্রিপ্টের যদি ঘুমের ফাংশন না থাকে তবে এটি কেবলমাত্র ECMAScript এর প্রয়োজন হয় না বলে। এটি জাভাস্ক্রিপ্টের ডিজাইনের জন্য দায়ীদেহের দ্বারা নকশার পছন্দ। এটি তৈরি করা যেতে পারে যে জাভাস্ক্রিপ্টের রান সময় পরবর্তী কোডের পরবর্তী লাইনটি চালানোর আগে একটি নির্দিষ্ট সময়ের জন্য অপেক্ষা করে, তবে তা না করার জন্য বেছে নেওয়া হয়েছিল।
দিদিয়ের এ

5
রিয়েল-টাইম স্পষ্টতা ছাড়াই জাভাস্ক্রিপ্টে নিদ্রাকে পুরোপুরি প্রয়োগ করা যেতে পারে। সর্বোপরি এটি একটি ইভেন্ট ভিত্তিক সিস্টেম। যদি অ্যাসিঙ্ক কলগুলি সম্পন্ন হয় তবে একটি ইভেন্ট ট্রিগার করা হবে। আমি কোনও কারণ দেখতে পাচ্ছি না যখন ঘুম () জারি করা হয় তখন যখন ঘুমন্ত না হওয়া পর্যন্ত ব্রাউজারে নিয়ন্ত্রণ ফিরে আসে, কলিং ফাংশনে নিয়ন্ত্রণ ফিরে আসে। এবং হ্যাঁ, আমি এটিও সম্মত করি যে কখনও কখনও ঘুমানো কার্যকর হয় বিশেষত যখন আপনি বিকাশকারীদের নকশাগুলি এত খারাপভাবে চালিত করার আগে আপনার কাছে সময় নেই যে সম্পূর্ণ রিফ্যাক্টরিং ছাড়া আপনার আর কোনও উপায় নেই
লরেন্স


4
জাভাস্ক্রিপ্টকে একক থ্রেডযুক্ত বলা কল্পকাহিনীর একটি। এটি প্রযুক্তিগতভাবে সঠিক হতে পারে তবে কার্যকরীভাবে এটি বহু-বিস্তৃত ল্যাংজের মতো কাজ করে। কাঁটাচামচ () সিমুলেট করা তুচ্ছ সহজ, এবং যদিও ফলন () সত্যিই বাস্তবায়িত হয় না, আপনি লক / সেমফোরে ভাগ করে নেওয়া মেমোরি ব্যবহার করে বেশ কাছাকাছি যেতে পারেন। গড় প্রোগ্রামারটির পক্ষে এটি বহু-থ্রেডযুক্ত হিসাবে বিবেচনা করা অর্থপূর্ণ; প্রযুক্তিগত নামটি কেবল ভাষার বিকাশকারীদের জন্য গুরুত্বপূর্ণ।
বেনুবার্ড

8
আমি সম্মত হলাম কেন sleep()জেএসে সম্ভব নয় এবং বেশিরভাগ সময় জিনিসগুলি করার আরও ভাল উপায় রয়েছে। তবে আমি এখনও ইঞ্জিনটি সমস্ত জিনিসকে একটি ডিজাইনের ত্রুটি হিসাবে সংযুক্ত করার পদ্ধতি বিবেচনা করব; sleep()ইঞ্জিন সিপিইউ ক্লবার্বিং না করে এবং অ্যাপ্লিকেশনটিকে পাগলের মতো হিমশীতল ছাড়া ভাষার কোনও নির্দিষ্ট স্ক্রিপ্ট, পৃষ্ঠা বা ফাংশন সীমাবদ্ধ করার কোনও কারণ নেই । এটি 2015 এবং আপনি একটি সম্পূর্ণ ওয়েব ব্রাউজার দিয়ে ক্রাশ করতে সক্ষম হবেন না while(1)। আমাদের মতো জিনিসগুলির জন্য ফ্ল্যাশ রয়েছে।
বিজেজর

660

জাভাস্ক্রিপ্টে, আমি প্রতিটি ফাংশন আবার লিখি যাতে এটি যত তাড়াতাড়ি সম্ভব শেষ হয়। আপনি ব্রাউজারটি আবার নিয়ন্ত্রণে রাখতে চান যাতে এটি আপনার ডোম পরিবর্তন করতে পারে।

আমি যখনই আমার ফাংশনটির মাঝখানে ঘুমাতে চাইছি তখনি আমি এটিকে ব্যবহার করার জন্য রিফ্যাক্টর করেছিলাম setTimeout()

সম্পাদন করা

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

একটি ঘুমের ফাংশন লেখা সহজ এবং জাভাস্ক্রিপ্ট প্রতিশ্রুতি দিয়ে আরও ব্যবহারযোগ্য করে তোলে:

// sleep time expects milliseconds
function sleep (time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

// Usage!
sleep(500).then(() => {
    // Do something after the sleep!
});

190
বন্ধের পথে। function foobar(el) { setTimeout(function() { foobar_cont(el); }, 5000); }
বিশৃঙ্খল

68
ঠিক আছে, এবং কোডটি ওয়েবপৃষ্ঠায় ব্যবহারের উদ্দেশ্যে না হলে কী হবে?
ইউজিনিও মিরি

10
@ EugenioMiró যদি কোডটি ওয়েবপৃষ্ঠায় ব্যবহারের উদ্দেশ্যে না হয় তবে হোস্টের অবজেক্ট মডেলটিকে একটি ঘুম পদ্ধতি প্রয়োগ করুন। - আমি মনে করি যে প্রশ্নটি ডিওএমের দিকে জোরালো হয়েছে যা ওয়েব পৃষ্ঠাগুলিতে জাভাস্ক্রিপ্ট চলমান।
BrainSlugs83

31
@ নসরডেনা হ্যাঁ, আমরা কীভাবে এসিঙ্ক কল করতে হয় তা বুঝতে পারি, এটি আমাদের ঘুমাতে সহায়তা করে না ()। আমি চাই আমার কলগুলি একটি নির্দিষ্ট ক্রমে করা হোক এবং একটি নির্দিষ্ট ক্রমে ডেটা ফিরিয়ে আনা হোক। লুপের জন্য আমি 5 স্তরের গভীর। আমি ব্লক কার্যকর করতে চাই সত্যিকারের ঘুমের পদ্ধতিটি "ব্রাউজারকে মন্থর" করে না, ঘুমের হাতগুলি ব্রাউজারে ফিরে আসে এবং অন্য কোনও থ্রেড যা সিপিইউ সময় চায় এটি এখনও অবরুদ্ধ অবস্থায় রয়েছে।
BrainSlugs83

382
এটি প্রশ্নের উত্তর নয়।
টিএমএস

302

কেবল ডিবাগ / দেবের জন্য, এটি কারওর জন্য দরকারী হলে আমি এটি পোস্ট করি

ফায়ারব্যাগে (এবং সম্ভবত অন্যান্য জেএস কনসোল) আকর্ষণীয় জিনিসগুলি, কেবলমাত্র ঘুমের সময় নির্দিষ্ট হওয়ার পরে (...) প্রবেশের পরে হিট করার পরে কিছুই হয় না ...

function sleepFor( sleepDuration ){
    var now = new Date().getTime();
    while(new Date().getTime() < now + sleepDuration){ /* do nothing */ } 
}

ব্যবহারের উদাহরণ:

function sleepThenAct(){ sleepFor(2000); console.log("hello js sleep !"); }

36
এটি কোনও উত্তর নয়। এটি প্রশ্নের সংক্ষিপ্ত আকারের মতোই, সামান্য খাটো ছাড়াও।
জাব

16
ব্যস্ত অপেক্ষা, সত্যি? জেএসে? কয়েক সেকেন্ডের জন্য? যদি আমি এটি করে কোনও ওয়েবসাইট ধরি তবে তা অবরুদ্ধ হয়ে যাবে।
মাফু

33
@mafu কেন বলছেন only for debug/dev... rolleyes
xDaizu

11
এটি কখনও করবেন না। এটি সিপিইউকে বাস্তবায়িত করবে এমন কোরটিতে 100% হিট করবে এবং এটি ব্লক করবে।
noogo

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

177

আমি অন্যান্য পোস্টারগুলির সাথে একমত, একটি ব্যস্ত ঘুম কেবল একটি খারাপ ধারণা।

যাইহোক, সেটটাইমআউট কার্যকর করে না, টাইমআউট সেট হয়ে যাওয়ার সাথে সাথে এটি ফাংশনের পরবর্তী লাইনটি কার্যকর করে, সময়সীমা সমাপ্ত হওয়ার পরে নয়, যাতে কোনও ঘুম যে কাজটি সম্পাদন করে সেই একই কাজটি সম্পাদন করে না।

এটি করার উপায় হ'ল অংশগুলির আগে এবং পরে আপনার ফাংশনটি ভাঙ্গা।

function doStuff()
{
  //do some things
  setTimeout(continueExecution, 10000) //wait ten seconds before continuing
}

function continueExecution()
{
   //finish doing things after the pause
}

আপনার ফাংশনটির নামগুলি প্রতিটি টুকরা কী করছে তা এখনও সঠিকভাবে বর্ণনা করেছে তা নিশ্চিত করুন (আইই গ্যাথার ইনপুটথইনওয়েট এবং চেক ইনপুট, ফানক্ট 1 এবং ফানক পার্ট 2 এর পরিবর্তে)

সম্পাদন করা

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

আরও সম্পাদনা

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


12
হ্যাঁ। যখন আপনার কাছে লুপ বা নেস্ট লুপ থাকে তখন এটি জটিল হয়ে ওঠে। আপনাকে লুপগুলির জন্য আপনার ত্যাগ করতে হবে এবং তার পরিবর্তে কাউন্টারগুলি রাখতে হবে।
নোসারেডা

Touche। আমি বলতে চাইছি, এটি এখনও সম্ভব হবে তবে সেই ক্ষেত্রে কুশ্রী এবং হ্যাকিশ। আপনি কিছু স্ট্যাটিক বুলিয়ান স্টেট ভেরিয়েবল ব্যবহার করতে পারেন তবে এটি বেশ হ্যাকিশও।
ডেভিনিবি

2
এর জন্য -1। আবার, এই প্রশ্নের উত্তর দেয় না। এটি "কীভাবে একটি ক্রিয়াকলাপকে সংবিধানে কার্যকর করতে হবে" এর মতো প্রশ্নের উত্তর, যা "কোড কার্যকর করার ক্ষেত্রে কীভাবে ব্লক করবেন" এর থেকে অনেকটাই আলাদা।
দীপক জিএম

6
@ নসরডনা না, আপনি একটি ক্লোজার ব্যবহার করবেন। উদাহরণস্বরূপ: function foo(index) { setTimeout(function() { foo_continue(index); }, 10000); }এবং for(var X = 0; X < 3;X++) { foo(X); }- এক্স এর মানটি এতে প্রবেশ করা হয় foo, যা শেষ পর্যন্ত indexযখন foo_continueডাকা হয় তখন নামের অধীনে পুনরায় ব্যবহৃত হয় ।
ইজকাটা

2
@ আলেকজান্ডার অবশ্যই এটি করে, কারণ সেটটাইমআউট () এর বিন্দুটি অ্যাসিক্রোনালি কোড চালিয়ে ব্রাউজারটিকে লকআপ করা থেকে বিরত রাখা। console.log()ভিতরে foo_continue()সেটটাইমআউট সংস্করণে রাখুন এবং আপনি একই ফলাফল পাবেন।
ইজকাটা

132

$ DEITY এর ভালবাসার জন্য দয়া করে ব্যস্ত-অপেক্ষা ঘুমের ক্রিয়াকলাপটি তৈরি করবেন না। setTimeoutএবং setIntervalআপনার যা যা প্রয়োজন তা করুন।

var showHide = document.getElementById('showHide');
setInterval(() => {
    showHide.style.visibility = "initial";
    setTimeout(() => {
        showHide.style.visibility = "hidden"
    }, 1000);
    ;
}, 2000);   
<div id="showHide">Hello! Goodbye!</div>

প্রতি দুই সেকেন্ড অন্তর এক সেকেন্ডের জন্য পাঠ্য লুকান। এটি প্রতিটি সেকেন্ডে পাঠ্য প্রদর্শন এবং লুকানোর জন্য কীভাবে সেটআইন্টারওয়াল এবং সেটটাইমআউট ব্যবহার করবেন তা দেখায়।


3
বেশিরভাগ ক্ষেত্রেই পুরোপুরি নয়: সেট ইনটারভাল ভোট দেওয়ার ক্ষেত্রে আরও ভাল ধারণা দেয়।
অন্নাকাটা

3
কোডটির এই টুকরাটি জাভাস্ক্রিপ্ট ইঞ্জিনে কী ধরে রাখবে না ?
ডেনিজ ডোগান

10
আপনার যদি ঘুমের দরকার হয় না সিঙ্ক্রোনাস হয়, সেক্ষেত্রে এটি সম্পূর্ণ বৈধ প্রশ্ন।
অ্যারন ডুফর

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

3
@ ফিললানাসা: সিন্ট্যাক্টিক বন্ধ যদি এখনও একটি ভীতিজনক হয় তবে নোড ১০১ এর মধ্য দিয়ে একজনকে মারাত্মকভাবে মাথা ঘোরানো এবং কাজ করা দরকার।
বিশৃঙ্খলা

113

আমি জানি এটি কিছুটা পুরানো প্রশ্ন, তবে (যদি আমার মতো) আপনি রাইনোর সাথে জাভাস্ক্রিপ্ট ব্যবহার করছেন তবে আপনি ব্যবহার করতে পারেন ...

try
{
  java.lang.Thread.sleep(timeInMilliseconds);
}
catch (e)
{
  /*
   * This will happen if the sleep is woken up - you might want to check
   * if enough time has passed and sleep again if not - depending on how
   * important the sleep time is to you.
   */
}

4
এটি কি জাভায় কল?
কেন শার্প

14
এটি জাভা জাভাস্ক্রিপ্ট
রুসউ

18
পুনঃটুইট এটাই জাভা
স্ক্রিপ্টটি

71

আপনি যদি jQuery ব্যবহার করছেন, কেউ আসলে "বিলম্ব" প্লাগইন তৈরি করেছেন যা সেটটাইমআউটটির জন্য মোড়ক ছাড়া আর কিছুই নয়:

// Delay Plugin for jQuery
// - http://www.evanbot.com
// - © 2008 Evan Byrne

jQuery.fn.delay = function(time,func){
    this.each(function(){
        setTimeout(func,time);
    });

    return this;
};

তারপরে আপনি এটি কেবল প্রত্যাশা অনুযায়ী এক সারি ফাংশন কলগুলিতে ব্যবহার করতে পারেন:

$('#warning')
.addClass('highlight')
.delay(1000)
.removeClass('highlight');

4
এটি কোনও খারাপ সমাধান নয়। প্রসঙ্গ এবং শৃঙ্খলাবদ্ধতা রাখে।
নসরেডনা

39
JQuery 1.4 হিসাবে, jQuery এর .delay()অংশ (যদিও উপরের বাস্তবায়ন থেকে শব্দার্থবিজ্ঞানের সাথে পৃথক)) api.jquery.com/delay
ম্যাট বল

7
এই প্রশ্নটিতে যা ছিল তা অবশ্যই একটি jQuery উত্তর ছিল । আমরা খুশি তাই খুশি!
এক্সডাইজু

1
আপনার যদি দুটি স্বতন্ত্র কলগুলির মধ্যে বিলম্বের প্রয়োজন হয় তবে হ্যাঁ। লুপটি ধীর করতে আপনার যদি বিলম্বের প্রয়োজন হয় তবে না।
ডাব্লুগ্রোলাও

46

আমি ঘুমের সমাধানও খুব অনুসন্ধান করেছি (উত্পাদন কোডের জন্য নয়, শুধুমাত্র দেব / পরীক্ষার জন্য) এবং এই নিবন্ধটি পেয়েছি:

http://narayanraman.blogspot.com/2005/12/javascript-sleep-or-wait.html

... এবং এখানে ক্লায়েন্ট-সাইড সমাধানগুলির সাথে অন্য লিঙ্কটি রয়েছে: http://www.devcheater.com/

এছাড়াও, আপনি কল করার সময় alert(), আপনার কোডটিও বিরতি দেওয়া হবে, সতর্কতা দেখানোর সময় - সতর্কতা প্রদর্শন না করার উপায় খুঁজে পাওয়া উচিত তবে একই প্রভাব পাওয়া যাবে get :)


35
আমি সম্মত, প্রচুর লোক বলছে, "না, প্রডাকশন কোডে এটি করবেন না!" হ্যাঁ, আমি চাই না। আমি এটি ট্রোওওয়ে টেস্ট কোডে করতে চাই এবং ফলস্বরূপ আমি একটি মার্জিত সমাধান তৈরি করতে অনেক সময় ব্যয় করতে চাই না।
ব্যবহারকারী435779

31

সিঙ্ক্রোনাস এক্সএমএলএইচটিপিআরকোয়েস্ট ব্যবহার করে এখানে একটি সহজ সমাধান:

function sleep(n){
  var request = new XMLHttpRequest();
  request.open('GET', '/sleep.php?n=' + n, false);  // `false` makes the request synchronous
  request.send(null);
}

ঘুমের বিষয়বস্তু

<?php sleep($_GET['n']);

এখন এটি দিয়ে কল করুন: ঘুম (5);


5
@ লুকাদ, setTimeout()যদি এটি কাজ করে তবে ব্যবহার করুন , তবে যদি এটির অর্থ হ'ল 1000 লাইন কলব্যাকগুলি উন্মুক্ত করা যায় তবে এটি কোনও রসিকতার মতো দেখতে শুরু করবে না।
পিগার্ডিরিও

11
অনন্য দৃষ্টিভঙ্গি, যদিও দুর্ভাগ্যক্রমে অ-অ্যাসিঙ্ক এক্সএমএলএইচটিপিআরকেস্টগুলি হ্রাস করা হয়েছে এবং ভবিষ্যতে সরানো হবে। কোনটি মজার, কারণ সেই সত্যটিই আমাকে প্রথম দিকে এই প্রশ্নের দিকে নিয়ে গিয়েছিল।
বিউজর

এটি আসলে বেশ ভাল ধারণা আইএমও is যদিও আমি মনে করি না যে স্লিপ এপিআই (অনুরোধ URL) জনসাধারণ হিসাবে প্রকাশিত হওয়া উচিত কারণ এটি ব্যবহার করা যেতে পারে।
ওয়াহিদ আমিরি

@ বিজোর সর্বদা কেবল ভবিষ্যতের কথা ভাবার অর্থ ভবিষ্যত অযৌক্তিকতার উপর বেঁচে থাকে :-)
ব্যবহারকারী ১74৪২২২২২

ভাল তবে আপনি কি জানেন যে কোনও সময় ইন্টারনেট ধীর হয় না বা ওয়েবসাইটের পিংয়ের সময়টি আর্গুমেন্ট সময়ের চেয়ে বেশি স্ক্রিপ্টের তুলনায় বেশি ঘুমায়। sleep(300)জাভাস্ক্রিপ্ট কোডের চেয়ে প্রতিক্রিয়া হিসাবে আপনি যদি ব্যবহার করেন এবং ওয়েবসাইট সময় নেন 150 এমএস 450 মিমি জন্য ঘুম হবে sleep এবং যদি ইন্টারনেট সংযোগ ব্রাউজারের মাধ্যমে হারিয়ে যায় তবে এটি কেবল 0 মিমি জন্য কাজ করবে। সুতরাং এটি আরও ভাল সমাধান নয়
এইচ চৌহান

30

আপনি এখানে যান। কোডটি যেমন বলেছে, কোনও খারাপ দেব হবেন না এবং এটি ওয়েবসাইটে ব্যবহার করুন। এটি একটি ডেভলপমেন্ট ইউটিলিটি ফাংশন।

// Basic sleep function based on ms.
// DO NOT USE ON PUBLIC FACING WEBSITES.
function sleep(ms) {
    var unixtime_ms = new Date().getTime();
    while(new Date().getTime() < unixtime_ms + ms) {}
}

17
ওপিতে যেমন ছিল ঠিক তেমনটাই।
অ্যান্ড্রু বারবার

5
আরও সুনির্দিষ্টভাবে বলতে গেলে, এটি ওপি একটি বিকল্প বিকল্প চেয়েছিল।
ডাব্লুগ্রোলাও

সমাধানটি ভাল নয় তবে কিছু জায়গায় async/awaitএটি দুর্ভাগ্যজনকভাবে প্রতিক্রিয়াশীল নয় এবং আমাদের এটি বাধ্যতামূলকভাবে ব্যবহার করতে হবে।
নবী KAZ

21

আমি ব্যক্তিগতভাবে সরল পছন্দ করি:

function sleep(seconds){
    var waitUntil = new Date().getTime() + seconds*1000;
    while(new Date().getTime() < waitUntil) true;
}

তারপর:

sleep(2); // Sleeps for 2 seconds

আমি P5js এ স্ক্রিপ্ট তৈরি করার সময় জাল লোড সময় তৈরি করতে এটি সর্বদা ব্যবহার করছি


3
আমি এটি মূল প্রশ্নের সর্বাধিক অনুকূলিত সংস্করণ হিসাবে দেখছি: এটি লুপের ভিতরে কোনও গণিত করে না, কেবল একটি সহজ তুলনা comparison এটি পড়া কিছুটা কঠিন
হেজেজ

4
এর আগে কখনও করবেন না। এই ফাংশনটি কাজ করার সময় আপনি কি সিপিইউ ব্যবহার পরীক্ষা করেছেন? এটির জন্য পর্যাপ্ত সময় দিলে এটি 100% এর কাছাকাছি হওয়া উচিত।
noego

2
@ হেজেজ: প্রদত্ত লুপটি নির্ধারিত পরিমাণ প্রাচীরের ঘড়ির জন্য চালিয়ে যাচ্ছে যাই হোক না কেন, মনে হচ্ছে লুপটিকে অনুকূল করা বিন্দুর পাশে একধরণের is
শ্যাডোর্যাঞ্জার

@ নয়েগো কিভাবে? আমি কেবল নোড 10 এ পরীক্ষা করেছি, আমার কোনও সিপিইউ ব্যবহারের পরিবর্তন নেই
মেলমাস

@ মেলমাস এই ফাংশনটি কেবলমাত্র সিপিইউকে 100% ব্যস্ত রেখে নোড থ্রেডকে ব্লক করে। এই "সমাধান" এই দুটি কারণে (ব্লকিং + সিপিইউ হত্যাকারী) একটি অত্যন্ত খারাপ ধারণা। অপেক্ষারত এটি অবরুদ্ধ নয়, অতএব অবিচ্ছিন্ন।
জেরেমি থিল

20

প্রথম:

আপনি এই জাতীয়ভাবে কার্যকর করতে চান এমন কোনও ফাংশন সংজ্ঞায়িত করুন:

function alertWorld(){
  alert("Hello World");
}

তারপরে সেটটাইমআউট পদ্ধতিটি দিয়ে তার নির্বাহের সময়সূচী করুন:

setTimeout(alertWorld,1000)

দুটি জিনিস নোট করুন

  • দ্বিতীয় যুক্তিটি মিলিসেকেন্ডে সময়
  • প্রথম যুক্তি হিসাবে আপনাকে প্রথম বন্ধনী ছাড়াই ফাংশনটির নাম (রেফারেন্স) দিতে হবে

18

বেশিরভাগ লোকেরা যা চান তা দেখতে দেখতে আরও ভাল সমাধান হ'ল অজ্ঞাতনামা ফাংশন ব্যবহার করা:

alert('start');
var a = 'foo';
//lots of code
setTimeout(function(){  //Beginning of code that should run AFTER the timeout
    alert(a);
    //lots more code
},5000);  // put the timeout here

আপনি সম্ভবত যা চান এটি এটি সম্ভবত আপনি সবচেয়ে কাছাকাছি পাবেন।

দ্রষ্টব্য, আপনার যদি একাধিক ঘুমের প্রয়োজন হয় তবে তাড়াতাড়ি এটি কুৎসিত হতে পারে এবং আপনার নকশাকে পুনর্বিবেচনা করার প্রয়োজন হতে পারে।


ডেস্কটপ ব্রাউজার এবং পুরানো মোবাইল ফোনে এটিই আমার জন্য কাজ করেছে। আমি চেষ্টা করেছি অন্যরাও কাজ করে নি।
মাইক

18

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

আপনার কলিং ফাংশন async রয়েছে তা নিশ্চিত করুন

যাচাই এবং সূক্ষ্ম কাজ


অবশেষে। এক এবং একমাত্র উত্তর।
জেরেমি থিল

10

ব্রাউজারগুলির জন্য, আমি সম্মত হই যে সেটটাইমআউট এবং সেটইন্টারভাল যাবার উপায়।

তবে সার্ভার-সাইড কোডের জন্য এটির জন্য একটি ব্লকিং ফাংশন প্রয়োজন হতে পারে (উদাহরণস্বরূপ, যাতে আপনি কার্যকরভাবে থ্রেড সিঙ্ক্রোনাইজেশন করতে পারেন)।

আপনি যদি নোড.জেএস এবং উল্কা ব্যবহার করছেন তবে আপনি কোনও ফাইবারে সেটটাইমআউট ব্যবহারের সীমাবদ্ধতার মধ্যে চলে যেতে পারেন। সার্ভার-পাশের ঘুমের কোড এখানে।

var Fiber = require('fibers');

function sleep(ms) {
    var fiber = Fiber.current;
    setTimeout(function() {
        fiber.run();
    }, ms);
    Fiber.yield();
}

Fiber(function() {
    console.log('wait... ' + new Date);
    sleep(1000);
    console.log('ok... ' + new Date);
}).run();
console.log('back in main');

দেখুন: https://github.com/laverdet/node-fibers# ঘুম


Server may require a blocking function... আমি দেখছি না যে নোডের একমাত্র থ্রেডকে জোর করে চাপানো এবং আপনার পুরো সার্ভারটিকে কয়েক সেকেন্ডের জন্য প্রতিক্রিয়াহীন করে তোলা ভাল ধারণা, তবে যাই হোক না কেন
জেরেমি থিল

10

মধ্যে ডেমো: আমি অন্য অ্যাসিঙ্ক্রোনাস কর্ম মাধ্যমে কোডের দৃঢ়তা জন্য অঙ্গীকার setTimeOut encapsulate হবে বেহালার

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

এর মতো ব্যবহৃত:

sleep(2000).then(function() { 
   // Do something
});

আপনি যদি প্রতিশ্রুতি ব্যবহার করেন তবে সিনট্যাক্স মনে রাখা সহজ।


4
কেন কেবল সেটটাইমআউট (ফাংশন () {/ * কিছু করা * /}, 2000) ব্যবহারের চেয়ে আরও ভাল এটি ??
জেসিরিস

10

অ্যাটমিক্স.ওয়েট ব্যবহার করে 2019 আপডেট

নোড 9.3 বা তারও বেশি ক্ষেত্রে কাজ করা উচিত।

নোড.জেজে আমার একটি খুব সঠিক টাইমার দরকার ছিল এবং এটি তার জন্য দুর্দান্ত কাজ করে। তবে মনে হয় ব্রাউজারগুলিতে চূড়ান্ত সীমিত সমর্থন রয়েছে।

let ms = 10000;
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);

কয়েক 10 সেকেন্ড টাইমার বেঞ্চমার্ক চালাও।

সেটটাইমআউট সহ আমি 7000 মাইক্রোসেকেন্ডে ত্রুটি পাই। (7ms)

পরমাণুর সাথে আমার ত্রুটিটি 600 মাইক্রোসেকেন্ডের নীচে থাকবে বলে মনে হচ্ছে। (0.6ms)

2020 আপডেট: সংক্ষেপে In

function sleep(millis){ // need help of a server-side page
  let netMillis=Math.max(millis-5,0); //assuming 5ms overhead
  let xhr=new XMLHttpRequest();
  xhr.open('GET','/sleep.jsp?millis='+netMillis+'&rand='+Math.random(), false);
  try{
    xhr.send();
  }catch(e){
  }
}
function sleepAsync(millis){ // use only in async function
  let netMillis=Math.max(millis-1,0); // assuming 1ms overhead
  return new Promise((resolve)=>{
    setTimeout(resolve, netMillis);
  });
}
function sleepSync(millis){ // use only in worker thread, currently Chrome-only
  Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, millis);
}

function sleepTest(){
  console.time('sleep');
  sleep(1000);
  console.timeEnd('sleep');
}
async function sleepAsyncTest(){
  console.time('sleepAsync');
  await sleepAsync(1000);
  console.timeEnd('sleepAsync');
}
function sleepSyncTest(){ 
  let source=`${sleepSync.toString()}
    console.time('sleepSync');
    sleepSync(1000);
    console.timeEnd('sleepSync');`;
  let src='data:text/javascript,'+encodeURIComponent(source);
  console.log(src);
  var worker=new Worker(src);
}

যার মধ্যে একটি সার্ভার-সাইড পৃষ্ঠা, উদাহরণস্বরূপ sleep.jsp, দেখতে দেখতে

<%
try{
  Thread.sleep(Long.parseLong(request.getParameter("millis")));
}catch(InterruptedException e){}
%>

আমার মতে গৃহীত সমাধানের চেয়ে উত্তম যা কল হিসাবে অ্যাসিঙ্ক / অপেক্ষা না করে সাধারণ ফাংশন হিসাবে প্রয়োগ করা যায় না।
গ্রোভিডটকম

হ্যাঁ, যতক্ষণ না আপনি জানেন যে এটি ব্লক করছে এবং এটি সাধারণত ভাল জিনিস নয়
কাপাইটানহুক

খুব দুর্দান্ত, তবে এটি সত্য যে এটি ক্রোম এবং ফায়ারফক্সে সমর্থিত তা ওয়েবে ব্যবহারের জন্য খুব কার্যকর হতে পারে না। (নভেম্বর 2019)
জেগ্রেটোরেক্স

9

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

'জাভাস্ক্রিপ্ট একক থ্রেডেড' কোনও বৈধ উত্তর নয়। উদাহরণস্বরূপ, কোনও কর্মীর মধ্যে ঘুমের ক্রিয়াকলাপ চালানো ইউআই থ্রেডে চলমান কোনও কোডই বাধা দেয় না।

জেনারেটর এবং ফলনকে সমর্থনকারী নতুন রানটাইমগুলিতে, একক থ্রেডযুক্ত পরিবেশে স্লিপ ফাংশনে অনুরূপ কার্যকারিতা আনতে পারে:

// This is based on the latest ES6 drafts.
// js 1.7+ (SpiderMonkey/Firefox 2+) syntax is slightly different

// run code you want to sleep here (ommit star if using js 1.7)
function* main(){
    for (var i = 0; i < 10; i++) {
        // to sleep for 10 milliseconds 10 times in a row
        yield 10;
    }

    yield 5;
    console.log('I just slept 5 milliseconds!');
}

// resume the given generator after ms milliseconds
function resume(ms, generator){
    setTimeout(function(){
        // ommit .value if using js 1.7
        var nextSleep = generator.next().value;
        resume(nextSleep, generator);
    }, ms);
}

// initialize generator and get first sleep for recursive function
var
    generator = main(),
    firstSleep = generator.next().value;

// initialize recursive resume function
resume(firstSleep, generator);

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


কমপক্ষে দশটি সংস্করণের মাধ্যমে কর্মীদের IE তে প্রয়োগ করা হয় না, যা বর্তমানে প্রচুর পরিমাণে ব্যবহারকারী উপস্থাপন করে।
বিজোর

সত্য, এবং তারপরেও sleepএকাধিক কর্মী ব্যবহার করে এটি প্রয়োগ করা ব্যবহারিক নয় । যদি নোড.জেএস ব্যবহার করে জেনারেটর ফাংশন ইতিমধ্যে বাস্তবায়িত হয় এবং বর্ণিত হিসাবে ব্যবহার করা যেতে পারে। মূলধারার ব্রাউজারগুলি আজকের মতো সমস্ত জেনারেটর প্রয়োগ করে নি।
গ্যাব্রিয়েল রেটনার

8

আমি জাভাস্ক্রিপ্ট স্লিপ / ওয়েট সম্পর্কে বেশ কয়েকটি ওয়েবপৃষ্ঠাগুলি সন্ধান / গুগল করেছি ... এবং যদি আপনি জাভাস্ক্রিপ্টকে "রুন, ডিলে, রুন" চান তবে এর কোনও উত্তর নেই ... বেশিরভাগ লোকেরা যা পেয়েছেন তা হ'ল, "চালাও, রুন (অকেজো) স্টাফ), RUN "বা" RUN, RUN + বিলম্বিত RUN "....

তাই আমি কিছু বার্গার খেয়েছি এবং ভাবতে পেরেছিলাম ::: এখানে একটি সমাধান রয়েছে যা কাজ করে ... তবে আপনাকে আপনার চলমান কোডগুলি কাটাতে হবে ... ::: হ্যাঁ, আমি জানি, এটি কেবল রিফ্যাক্টরিং পড়তে সহজ easier ... এখনও ...

// ......................................... // উদাহরণ 1:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setInterval
var i = 0;

function run() {
    //pieces of codes to run
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i >2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; }
    if (i==5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } //end interval, stops run
    i++; //segment of code finished running, next...
}

run();
t=setInterval("run()",1000);

</script>
</body>
</html>

// .................................... // উদাহরণ 2:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout
var i = 0;

function run() {
    //pieces of codes to run, can use switch statement
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(1000);}
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(2000);}
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(3000);}
    if (i==3){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>";} //stops automatically
    i++;
}

function sleep(dur) {t=setTimeout("run()",dur);} //starts flow control again after dur

run(); //starts
</script>
</body>
</html>

// ................. উদাহরণ3:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout
var i = 0;

function flow() {
    run(i);
    i++; //code segment finished running, increment i; can put elsewhere
    sleep(1000);
    if (i==5) {clearTimeout(t);} //stops flow, must be after sleep()
}

function run(segment) {
    //pieces of codes to run, can use switch statement
    if (segment==0){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==1){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
}

function sleep(dur) {t=setTimeout("flow()",dur);} //starts flow control again after dur

flow(); //starts flow
</script>
</body>
</html>

// .............. উদাহরণ 4:

<html>
<body>
<div id="id1">DISPLAY</div>

<script>
//javascript sleep by "therealdealsince1982"; copyrighted 2009
//setTimeout, switch
var i = 0;

function flow() {
    switch(i)
    {
        case 0:
            run(i);
            sleep(1000);
            break;
        case 1:
            run(i);
            sleep(2000);
            break;
        case 5:
            run(i);
            clearTimeout(t); //stops flow
            break;
        default:
            run(i);
            sleep(3000);
            break;
    }
}

function run(segment) {
    //pieces of codes to run, can use switch statement
    if (segment==0){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==1){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment==2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    if (segment >2){document.getElementById("id1").innerHTML= "<p>code segment "+ segment +" is ran</p>"; }
    i++; //current segment of code finished running, next...
}

function sleep(dur) {t=setTimeout("flow()",dur);} //starts flow control again after dur

flow(); //starts flow control for first time...
</script>
</body>
</html>

5
ঠিক আছে, এটি সেটটাইমপুট নিয়ে কাজ করে তবে কী ঘটছে তা দেখা মুশকিল। সেটটাইমআউট ব্যবহার নিজেই এর চেয়ে সহজ।
নওগুর

7
function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

এটি আসল প্রশ্নের মতোই। এটি আসল উত্তর তৈরি খুব একটা পয়েন্ট নয়।
ইএমএল

2
কোনও ভাল সমাধান নয় - সেলেনিয়ামের জাভাস্ক্রিপ্টএক্সিকিউটারটিতে এটি ব্যবহার করে আমার ক্রোম ব্রাউজারটি প্রায় 2104 ম্যাকবুক প্রোতে প্রায় 50% সময় স্তব্ধ করে দেয়।
এমেরি 6'15

7

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

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

এটি আই 11 এ কাজ করে না। আমরা তীর ফাংশনের জন্য সিনট্যাক্স ত্রুটি পাই।
DDphp

@ জাভা-ডি কে ব্যবহারawait new Promise(function(resolve) { setTimeout(resolve, 5000); });
k06a

6

আপনি জাভাস্ক্রিপ্টের মতো ঘুমাতে পারবেন না, বা বরং, আপনার করা উচিত নয়। একটি ঘুম বা কিছুক্ষণ লুপ চালানো ব্যবহারকারীর ব্রাউজারটি লুপটি না হওয়া পর্যন্ত স্তব্ধ হয়ে যায়।

আপনি উল্লেখ করা লিঙ্কে নির্দিষ্ট হিসাবে একটি টাইমার ব্যবহার করুন।


6

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


6

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


6

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

for (var i=0;i<1000000;i++){                    
     //waiting
  }

আমি এটি করতে কোনও খারাপ দিক দেখছি না এবং এটি আমার পক্ষে কৌশলটি করেছে।


এটি দূরে সংকলিত হতে পারে।
ভিক্টর সেহর

দয়া করে এটি করবেন না don't এটি একটি ব্লকিং স্লিপ কল, যার অর্থ আপনার কোড জেএস থ্রেডটি হোগিং করার সময় অন্য কোনও জাভাস্ক্রিপ্ট চলতে পারে না।
স্টিভ মিডলেগি

5
@ স্টিভমিডলি "আপনার কোড জেএস থ্রেডটি হোগিং করার সময় আর কোনও জাভাস্ক্রিপ্ট [সক্ষম হচ্ছেন] চালানো যাচ্ছে না" আমার কাছে মনে হয় ওপি ঠিক কী করতে চায় ¯_ (ツ) _ / ¯
ড্রিগোএঞ্জেলো

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

1 মিলিয়ন খুব বড়। আমার জন্য যথেষ্ট 10 ক
ভ্লাদ

6

এটি জাভার ঘুম পদ্ধতি ব্যবহার করে করা যেতে পারে। আমি এফএফ এবং আইআইতে এটি পরীক্ষা করেছি এবং এটি কম্পিউটারকে লক করে না, সংস্থানগুলি চিবিয়ে দেয় না বা অবিরাম সার্ভার হিট দেয়। আমার কাছে পরিষ্কার সমাধান বলে মনে হচ্ছে।

প্রথমে আপনাকে জাভা পৃষ্ঠাতে লোড করতে হবে এবং এর পদ্ধতিগুলি উপলভ্য করতে হবে। এটি করার জন্য, আমি এটি করেছি:

<html>
<head>

<script type="text/javascript">

  function load() {
    var appletRef = document.getElementById("app");
    window.java = appletRef.Packages.java;
  } // endfunction

</script>

<body onLoad="load()">

<embed id="app" code="java.applet.Applet" type="application/x-java-applet" MAYSCRIPT="true" width="0" height="0" />

তারপরে, আপনি যখন আপনার জেএসে ব্যথাহীন বিরতি চান তখন আপনাকে যা করতে হবে তা হ'ল:

java.lang.Thread.sleep(xxx)

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

var isReady = eval('document.batchForm.ready');
isReady.value=0;

frames['rpc_frame'].location.href=url;

while (isReady.value==0) {
  java.lang.Thread.sleep(250);
} // endwhile

window.frames['rpc_frame'].focus();
window.frames['rpc_frame'].print();

সুতরাং ব্যবহারকারী বোতামটি চাপায়, স্ক্রিপ্টটি চালান পৃষ্ঠাটি লোড করে, তারপরে অপেক্ষা করে, চালান পৃষ্ঠাটি লোড করা শেষ হয়েছে কিনা তা দেখার জন্য প্রতি সেকেন্ডে দ্বিতীয়টি পরীক্ষা করে, তারপরে ব্যবহারকারীটিকে প্রিন্টারে প্রেরণের জন্য মুদ্রণ ডায়ালগটি পপ আপ করে। Qed।


12
লেখক যে সাধারণ জিনিসটি অর্জন করতে চেয়েছিলেন সেই বিষয়টি বিবেচনা করার সময় বেশ নিবিড় আত্মঘাতী বলে মনে হয়।
xaralis

2
এটি জাভা অ্যাপলেটগুলির উপর নির্ভর করে যা অবনতিযুক্ত।
ওয়াহিদ আমিরি

6

অনেকগুলি উত্তর (সরাসরি) প্রশ্নের উত্তর দেয় না এবং এটি একটিও দেয় না ...

এখানে আমার দুটি সেন্ট (বা ফাংশন):

আপনি যদি এর চেয়ে কম ক্লঙ্কি ফাংশন চান setTimeoutএবং setIntervalআপনি এগুলি ফাংশনে আবদ্ধ করতে পারেন যা কেবলমাত্র যুক্তিগুলির ক্রমটিকে বিপরীত করে দেয় এবং তাদের সুন্দর নাম দেয়:

function after(ms, fn){ setTimeout(fn, ms); }
function every(ms, fn){ setInterval(fn, ms); }

কফিস্ক্রিপ্ট সংস্করণ:

after = (ms, fn)-> setTimeout fn, ms
every = (ms, fn)-> setInterval fn, ms

তারপরে আপনি এগুলি বেনামে ফাংশন সহ সুন্দরভাবে ব্যবহার করতে পারেন:

after(1000, function(){
    console.log("it's been a second");
    after(1000, function(){
        console.log("it's been another second");
    });
});

এখন এটি "এন মিলিসেকেন্ডের পরে, ..." (বা "প্রতিটি এন মিলিসেকেন্ড, ...") হিসাবে সহজেই পড়া যায়


5

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

function itemHandler(item)
{
    alert(item);
}

var itemSet = ['a','b','c'];

// Each call to itemHandler will execute
// 1 second apart
for(var i=0; i<itemSet.length; i++)
{
    var secondsUntilExecution = i;
    itemHandler.delay(secondsUntilExecution, item)
}

5

আপনি যদি নোড.জেএসে থাকেন তবে আপনি ফাইবারগুলি দেখতে পারেন - নোডে নেটিভ সি এক্সটেনশন, একটি কিন্ডা-মাল্টি-থ্রেডিং সিমুলেশন।

এটি আপনাকে একটি বাস্তব করার অনুমতি দেয় sleep উপায়ে যা কোনও ফাইবারের মাধ্যমে কার্যকরকরণ অবরুদ্ধ করে, তবে এটি মূল থ্রেড এবং অন্যান্য ফাইবারগুলিতে অ-ব্লক করে না।

তাদের নিজস্ব রিডমি থেকে তাজা একটি উদাহরণ এখানে:

// sleep.js

var Fiber = require('fibers');

function sleep(ms) {
    var fiber = Fiber.current;
    setTimeout(function() {
        fiber.run();
    }, ms);
    Fiber.yield();
}

Fiber(function() {
    console.log('wait... ' + new Date);
    sleep(1000);
    console.log('ok... ' + new Date);
}).run();
console.log('back in main');

- এবং ফলাফলগুলি হ'ল:

$ node sleep.js
wait... Fri Jan 21 2011 22:42:04 GMT+0900 (JST)
back in main
ok... Fri Jan 21 2011 22:42:05 GMT+0900 (JST)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.