পরবর্তী লাইনটি কার্যকর করার আগে 5 সেকেন্ড অপেক্ষা করুন


311

নীচের এই ফাংশনটি আমি যেমন চাই তেমন কাজ করে না; জেএসের নবাগত হওয়ার কারণে আমি বুঝতে পারি না।

আমি এটা চেক কিনা আগে 5 সেকেন্ড অপেক্ষা করতে হবে newStateহয় -1

বর্তমানে এটি অপেক্ষা করে না, এটি সরাসরি সরাসরি পরীক্ষা করে।

function stateChange(newState) {
  setTimeout('', 5000);

  if(newState == -1) {
    alert('VIDEO HAS STOPPED');
  }
}

উত্তর:


323

আপনি যে কলব্যাক ফাংশন সরবরাহ করছেন তাতে আপনার কোডটি রাখতে হবে setTimeout:

function stateChange(newState) {
    setTimeout(function () {
        if (newState == -1) {
            alert('VIDEO HAS STOPPED');
        }
    }, 5000);
}

অন্য কোনও কোড অবিলম্বে কার্যকর করা হবে ute


4
প্রধান সমস্যাটি হ'ল কিছু ক্ষেত্রে (বিশেষত টেস্টিং) এটি ভয়াবহভাবে অপর্যাপ্ত। ফাংশন থেকে ফিরে আসার আগে যদি আপনার 500 মিমি ঘুমানোর দরকার হয়, উদাহরণস্বরূপ ধীর অসম্পূর্ণ HTTP অনুরোধ অনুকরণ করার জন্য?
এগ্র্যান্ড

14
যদি "টেস্টিং" দ্বারা আপনি ইউনিট পরীক্ষা বোঝাতে চান: আপনার পরীক্ষার কাঠামোর অ্যাসিঙ্ক পরীক্ষা চালানোর একটি উপায় থাকা উচিত। আপনি যদি ম্যানুয়াল টেস্টিংটি বোঝাতে চান: ধীর অনুরোধগুলি অনুকরণ করার জন্য ক্রোমের নেটওয়ার্ক ট্যাবে থ্রোটলিং ড্রপডাউন রয়েছে।
জোসেফ সিলবার

1
আমি যদি ক্রোম এক্সটেনশানটি বিকাশ করি এবং ইনজেকশন স্ক্রিপ্টের সর্বশেষ মূল্যায়ন মানটি আমাকে ফলাফল দেয়; এবং আমার কিছু বিলম্ব দরকার?
মিরেক

182

আপনার সত্যই এটি করা উচিত নয় , টাইমআউটটির সঠিক ব্যবহার হ'ল ওপি'র সমস্যা এবং অন্য কোনও অনুষ্ঠানের জন্য সঠিক সরঞ্জাম যা আপনি কিছু সময়ের পরে কিছু চালাতে চান। জোসেফ সিলবার তার উত্তরে তা ভাল করে দেখিয়েছেন। তবে, যদি কিছু অ-উত্পাদনের ক্ষেত্রে আপনি সত্যিকার অর্থে কিছু সময়ের জন্য মূল থ্রেডটি ঝুলতে চান, এটি এটি করবে।

function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end < start + ms) {
     end = new Date().getTime();
  }
}

ফর্মটিতে কার্যকরকরণের সাথে:

console.log('before');
wait(7000);  //7 seconds in milliseconds
console.log('after');

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


7
এটি জাভাস্ক্রিপ্ট চালানো বন্ধ করবে না।
টেরি লিন

23
@ টেরিলিন এটি চালানোর চেষ্টা করুন।
মাইক

6
সুতরাং মূলত আপনি সিপিইউ সময় নষ্ট করছেন। এটি কোনও অপেক্ষা নয় কারণ আপনি থ্রেডটি স্লিপ মোডে রাখছেন না মূল প্রসেসরটিকে অন্য কাজে ফোকাস করার অনুমতি দেয়।
কিওর্ডেল

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

1
ভয়াবহ সমাধান আইএমএইচও - হ'ল সিপিইউ যখন "ঘুমোচ্ছে"। ঘুমানোর সঠিক উপায়টি হ'ল async / এই উত্তরটির stackoverflow.com/questions/951021/… বা এটিয়েন এর অপেক্ষা অপেক্ষা করুন ।
ডেভিড সিমিক 21

162

নতুন অ্যাসিঙ্ক / প্রতীক্ষিত সিনট্যাক্স ব্যবহার করে এখানে একটি সমাধান দেওয়া হয়েছে ।

ব্রাউজার সমর্থন যাচাই করতে ভুলবেন না কারণ এটি ECMAScript 6 এর সাথে প্রবর্তিত একটি নতুন বৈশিষ্ট্য।

ইউটিলিটি ফাংশন:

const delay = ms => new Promise(res => setTimeout(res, ms));

ব্যবহার:

const yourFunction = async () => {
  await delay(5000);
  console.log("Waited 5s");

  await delay(5000);
  console.log("Waited an additional 5s");
};

এই পদ্ধতির সুবিধাটি হ'ল এটি আপনার কোডটিকে চেহারা এবং সিঙ্ক্রোনাস কোডের মতো আচরণ করে।


ইসমাস্ক্রিপ্ট Don't লাগবে না: আপনি যদি ইতিমধ্যে অ্যাসিঙ্ক লোডিংয়ের জন্য প্রতিশ্রুতি ব্যবহার করছেন এবং কেবল দীর্ঘ সময় নিয়ে চেইনের একটি অংশ নকল করতে চান তবে আপনি এই অপেক্ষা () ফাংশনটিকে শৃঙ্খলে যুক্ত করতে পারেন।
ডোভভ হেফেটজ

2
এটি সত্যই নতুন সিনট্যাক্সের সাথে সেরা উত্তর। উপরের অপেক্ষা () সমাধানটি ব্যবহার করার ক্ষেত্রে আমার সমস্যা ছিল।
পিয়ানোম্যান 102

37

এই জাতীয় বিলম্বের ফাংশনটি ব্যবহার করুন:

var delay = ( function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();

ব্যবহার:

delay(function(){
    // do stuff
}, 5000 ); // end delay

ক্রেডিটস: ব্যবহারকারী টাইপিং বন্ধ না করা পর্যন্ত কীভাবে .keyup () হ্যান্ডলারটি বিলম্ব করবেন?


36

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

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

function stateChange(newState) {
    setTimeout(function(){
        if(newState == -1){alert('VIDEO HAS STOPPED');}
    }, 5000);
}

তবে, আপনার যদি এই জাতীয় কোড থাকে:

stateChange(-1);
console.log("Hello");

console.log()বিবৃতি অবিলম্বে চালানো হবে। stateChange()ফাংশনে সময় শেষ হওয়ার পরে এটি অপেক্ষা করবে না । আপনি কেবল পূর্বনির্ধারিত সময়ের জন্য জাভাস্ক্রিপ্ট কার্যকর করতে বিরতি দিতে পারবেন না।

পরিবর্তে, যে কোনও কোড আপনি বিলম্ব করতে চান তা অবশ্যই setTimeout()কলব্যাক ফাংশনের (অথবা সেই ফাংশন থেকে কল করা) ভিতরে থাকতে হবে ।

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


31
আপনি কেবল পূর্বনির্ধারিত সময়ের জন্য জাভাস্ক্রিপ্ট কার্যকর করতে বিরতি দিতে পারবেন না । আমার ধারণা আপনার বোঝানো উচিত নয়, যেহেতু আপনি পারবেন (যদি আপনি নিজেকে var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
ঝুলতে

9
@ জোসেফসিলবার - ঠিক আছে, আপনি এটি করতে পারেন, তবে বাস্তবে যা অনেক ব্রাউজার কাজ করে না তা একটি ডায়ালগ তৈরি করবে যে কোনও স্ক্রিপ্ট প্রতিক্রিয়াহীন হয়ে উঠেছে এবং এটি একটি ভয়াবহ ব্যবহারকারীর অভিজ্ঞতা এবং এটি ব্যাটারির জীবনের পক্ষে খারাপ এবং পৃষ্ঠাটি হ'ল এমনটি করার সময় স্তব্ধ হয়ে গিয়েছিল এবং ... এটি খারাপ হবে।
jਫਰ00

12
ওয়েল অবশ্যই ভয়ঙ্কর হবে, এবং কোন এক উচিত কখনও কখনও কখনও কখনও কখনও কখনও তা করতে। আমি কেবল আমার অভ্যন্তরের "ভাল-বাস্তব" প্রতিরোধ করতে পারি নি । দুঃখিত।
জোসেফ সিলবার

31

আপনি যদি একটি অ্যাসিঙ্ক ফাংশনে থাকেন তবে আপনি কেবল এক লাইনে এটি করতে পারেন:

console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);

বিজ্ঞপ্তি , যদি লক্ষ্যটি নোডজেএস হয় তবে এটি এটি ব্যবহার করা আরও দক্ষ হবে (এটি একটি পূর্বনির্ধারিত প্রতিশ্রুত সেটটাইমআউট ফাংশন):

await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec

দুটি বাস্তবায়নের মধ্যে পার্থক্য কী?
এজেভেদো

1
বর্তমানে, কোনও পার্থক্য নেই। তবে যদি কোনও মুহুর্তে নোড এটিকে দ্রুত / নিরাপদ / আরও দক্ষ করে তোলার সিদ্ধান্ত নেবে তবে আপনি নোড জেএস সংস্করণটি সামনে ব্যবহার করবেন। যদিও রিডাবিলিটি বেশিরভাগ লোকের পক্ষে মূল কারণ হওয়ার সম্ভাবনা বেশি, তবে এই ক্ষেত্রে আপনি প্রথম উপায়টি আরও ভালভাবে ব্যবহার করুন use
Shl

ধন্যবাদ. আপনার উত্তরটি এমন একটি সমস্যার সমাধান করেছে যেটি আমি ইতিমধ্যে তিন দিন ধরে সম্মুখীন হয়েছি। ধন্যবাদ।
ইজেভেদো

8

এটা চেষ্টা কর:

//the code will execute in 1 3 5 7 9 seconds later
function exec() {
    for(var i=0;i<5;i++) {
        setTimeout(function() {
            console.log(new Date());   //It's you code
        },(i+i+1)*1000);
    }
}

আমি ভেবেছিলাম প্রথমে এটি ভুল ছিল, তবে এটি দুর্দান্ত।
পাসকালাল গাণে

7

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

function waitSeconds(iMilliSeconds) {
    var counter= 0
        , start = new Date().getTime()
        , end = 0;
    while (counter < iMilliSeconds) {
        end = new Date().getTime();
        counter = end - start;
    }
}


3

জোসেফ সিলবারের উত্তরের ভিত্তিতে আমি এটি আরও কিছু জেনেরিকের মতো করব।

আপনার কাজ হবে (আসুন প্রশ্নের ভিত্তিতে একটি তৈরি করুন):

function videoStopped(newState){
   if (newState == -1) {
       alert('VIDEO HAS STOPPED');
   }
}

এবং আপনার জন্য একটি ওয়েট ফাংশন থাকতে পারে:

function wait(milliseconds, foo, arg){
    setTimeout(function () {
        foo(arg); // will be executed after the specified time
    }, milliseconds);
}

শেষে আপনি হবে:

wait(5000, videoStopped, newState);

এটি একটি সমাধান, আমি অপেক্ষা ফাংশনে যুক্তিগুলি ব্যবহার করব না (কেবল foo();পরিবর্তে এর চেয়ে বেশি হওয়া উচিত)foo(arg); ) তবে এটি উদাহরণস্বরূপ।


3

রিফ্রেশ নিয়ন্ত্রণের জন্য এই সমাধানটি রিয়েট নেটিভের ডকুমেন্টেশন থেকে আসে :

function wait(timeout) {
    return new Promise(resolve => {
        setTimeout(resolve, timeout);
    });
}

ওপি-র প্রশ্নের এটিকে প্রয়োগ করতে, আপনি এই ফাংশনটি সমন্বয় করে ব্যবহার করতে পারেন await:

await wait(5000);
if (newState == -1) {
    alert('Done');
}

1

আপনি আপনার কার্যক্রমে ছোট পরিবর্তন করে দেরি করতে পারেন (async এবং অপেক্ষা করুন)।

const add5SecondsDelay = () => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('5 seconds');
    }, 50000);
  });
}

async function asyncFunctionCall() {

  console.log("stpe-1"); 
  const result = await add5SecondsDelay ();
  console.log("step-2 after 5 seconds delay"); 

}

asyncFunctionCall();


-2

নতুন জেএস ফাংশন তৈরি করুন

function sleep(delay) {
        var start = new Date().getTime();
        while (new Date().getTime() < start + delay);
      }

আপনি কার্যকর করতে বিলম্ব করতে চাইলে ফাংশনটি কল করুন। বিলম্বের মানের জন্য মিলি সেকেন্ড ব্যবহার করুন।

####Some code
 sleep(1000);
####Next line

3
এটি অত্যধিক সংস্থান গ্রহণ করবে।
আভাবি

-2

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

ফায়ারফক্স এবং গুগল ক্রোম এইভাবে গেম শুরু করতে ব্যবহার করা যাবে না।

<html<body>
<a href="E:\game\game.exe" name="game" onmouseout="waitclose(7000);"> game
<img src="game.jpg" width="100%" height="97%" ></a>
<script>
function waitclose(ms){
 var start = new Date().getTime();var end=start;
 while(end < start + ms) {end = new Date().getTime();}
window.open('', '_self', ''); window.close();
}
</script>
</body></html>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.