জাভাস্ক্রিপ্টে ঘুম - ক্রিয়াগুলির মধ্যে বিলম্ব


129

জাভাস্ক্রিপ্টে এটি অন্য কোনও ক্রিয়াকলাপ চালানোর আগে আমি কীভাবে ঘুমোতে পারি?

উদাহরণ:

 var a = 1+3;
 // Sleep 3 seconds before the next action here
 var b = a + 4;

উত্তর:


140

আপনি setTimeoutঅনুরূপ প্রভাব অর্জন করতে ব্যবহার করতে পারেন :

var a = 1 + 3;
var b;
setTimeout(function() {
    b = a + 4;
}, (3 * 1000));

এটি সত্যিই 'ঘুম' জাভাস্ক্রিপ্ট নয় just এটি কেবল setTimeoutএকটি নির্দিষ্ট সময়কালের পরে পাস ফাংশনটি কার্যকর করে (মিলি সেকেন্ডে উল্লিখিত)। যদিও জাভাস্ক্রিপ্টের জন্য একটি স্লিপ ফাংশন লেখা সম্ভব তবে এটি সম্ভব হলে ব্যবহার করা ভাল setTimeoutকারণ এটি ঘুমের সময়কালে সবকিছু হিমায়িত করে না।


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

5
এটি প্রশ্নের উত্তর দেয় না। প্রশ্নটি "ঘুম" সমতুল্যের জন্য জিজ্ঞাসা করে যা এটি নয়।
22-25 এ অবিরত

যদিও এই উত্তরটি প্রশ্নটি জিজ্ঞাসা করে তার সাথে মেলে না তবে এটি লুপের চেয়ে বেশি দরকারী এবং তারিখ.নো () এর সাথে তুলনা করুন। ব্লক লুপটি কী ব্যবহার করবেন তা প্রয়োগ করুন ঘুমকে কার্যকর করুন।
লি চুনলিন

2
যদি না, অবশ্যই, একটি অবরোধ লুপ ঠিক কি কারো চায়।
ওঙ্কো দ্য সনে

55

আপনি যদি সত্যিই sleep()কিছু পরীক্ষা করার জন্য প্রয়োজন । তবে সচেতন থাকুন যে এটি বেশিরভাগ সময় ডিবাগিন করার সময় ব্রাউজারটি ক্রাশ হয়ে যায় - সম্ভবত সে কারণেই আপনার এটি প্রয়োজন need প্রোডাকশন মোডে আমি এই ফাংশনটি মন্তব্য করব।

function pauseBrowser(millis) {
    var date = Date.now();
    var curDate = null;
    do {
        curDate = Date.now();
    } while (curDate-date < millis);
}

new Date()লুপটিতে ব্যবহার করবেন না , যদি না আপনি মেমোরি, প্রসেসিং শক্তি, ব্যাটারি এবং সম্ভবত আপনার ডিভাইসের আজীবন নষ্ট করতে চান।


8
এই উত্তরটি আরও ভোটের দাবিদার। প্রশ্নের উত্তরের এই উত্তরটির কারণ মাত্র।
jagc

"অত্যধিক পুনরাবৃত্তি" সতর্কতা সম্পর্কে কি?
ওকি এরি রিনালাদি

1
@ ওকিইরিণালদী সেখানে কোনও পুনরাবৃত্তি নেই, এটি কেবল একটি লুপ।
রডরিগো

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

2
"ব্যস্ত ওয়েটিং"।
Zeek2

13

ECMAScript 6 সংস্করণ, "কোড ব্লকিং" এর ফলন সহ জেনারেটর ব্যবহার করে:

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

let sleeptime = 100
function* clock()
{
    let i = 0
    while( i <= 10000 )
    {
        i++
        console.log(i); // actually, just do stuff you wanna do.
        setTimeout(
            ()=>
            {
                clk.next()
            }
            , sleeptime
        )
        yield
    }
}

let clk = clock()
clk.next()

ফাংশন *

() => তীর ফাংশন

আপনি প্রতিশ্রুতিগুলির মাধ্যমে ইভেন্টগুলি চেইনও করতে পারেন :

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


sleep(1000).then(function()
{
    console.log('1')
    sleep(1000).then(function()
    {
        console.log('2')
    })
})

অথবা অনেক সহজ এবং একটি অভিনব উপায় হবে

function sleep(ms, f)
{
    return(
        setTimeout(f, ms)
    )
}


sleep(500, function()
{
    console.log('1')
    sleep(500, function()
    {
        console.log('2')
    })
})
console.log('Event chain launched')

আপনি যদি কিছু শর্ত হওয়ার জন্য অপেক্ষা করেন তবে আপনি এটির মতো অপেক্ষা করতে পারেন

function waitTill(condition, thenDo)
{
    if (eval(condition))
    {
        thenDo()
        return
    }

    setTimeout(
        ()    =>
        {
            waitTill(condition, thenDo)
        }
        ,
        1
    )
}

x=0

waitTill(
    'x>2 || x==1'
    ,
    ()    =>
    {
        console.log("Conditions met!")
    }
)

// Simulating the change
setTimeout(
    () =>
    {
        x = 1
    }
    ,
    1000
)


11

2018 আপডেট

সর্বশেষতম সাফারি, ফায়ারফক্স এবং নোড.জেগুলি এখন async / প্রতীক্ষা / প্রতিশ্রুতিগুলিকে সমর্থন করছে।

Async / প্রতীক্ষা / প্রতিশ্রুতি ব্যবহার করে:

(1/2017 হিসাবে, ক্রোমে সমর্থিত, তবে সাফারি, ইন্টারনেট এক্সপ্লোরার, ফায়ারফক্স, নোড.জেএস এ নয়)

'use strict';

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

let myAsyncFunc = async function() {
  console.log('Sleeping');
  await sleep(3000);
  console.log('Done');
}

myAsyncFunc();

2017 আপডেট

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

একটি জেনারেটর ফাংশন ব্যবহার করে:

'use strict';

let myAsync = (g) => (...args) => {
    let f, res = () => f.next(),
        sleep = (ms) => setTimeout(res, ms);
    f = g.apply({sleep}, args); f.next();
};

let myAsyncFunc = myAsync(function*() {
    let {sleep} = this;
    console.log("Sleeping");
    yield sleep(3000);
    console.log("Done");
});

myAsyncFunc();

এই উভয় সমাধান প্রকৃতির অ্যাসিনক্রোনাস হয় তা মনোযোগ দিন। এর অর্থ হ'ল myAsyncFunc (উভয় ক্ষেত্রে) ঘুমানোর সময় ফিরে আসবে।

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


1
এখন পর্যন্ত সেরা উত্তর !! আমি খুঁজে পেতে 30 মিনিট সর্বত্র অনুসন্ধানে ব্যয় করেছি .. বিগ থেক্স !!!
538 রোমো

1
সমাধান খুঁজতে গিয়ে আমি এই উত্তরটি মিস করেছি এবং সাইকেলটি পুনরায় উদ্ভাবন করেছি: ডি যদি আমি এটি দেখতে পেতাম তবে এটি আমার কয়েক ঘন্টা বাঁচাতো !! সম্মত!
sserzant

let co = gen => (...args) => { let iter = gen(...args); let resume = () => new Promise((resolve, reject) => { let result = iter.next(); if (result.done) resolve(result.value); else Promise.resolve(result.value).then(resume).then(resolve, reject); }); return resume(); };আপনার দ্বিতীয় কোড ব্লক থেকে let asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);সংজ্ঞা ব্যবহার করে আপনাকে করতে দেয় sleep()
প্যাট্রিক রবার্টস

3

আপনি যদি এর চেয়ে কম ক্লঙ্কি ফাংশন চান 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");
    });
});

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


2

এটি করার আরেকটি উপায় হ'ল প্রতিশ্রুতি এবং সেটটাইমআউট (নোট করুন যে কোনও ফাংশনের অভ্যন্তরে থাকা এবং এ্যাসিঙ্ক কীওয়ার্ডের সাথে এ্যাসক্রোনাস হিসাবে সেট করা দরকার):

async yourAsynchronousFunction () {

    var a = 1+3;

    await new Promise( (resolve) => {
        setTimeout( () => { resolve(); }, 3000);
    }

    var b = a + 4;

}

2

এটি করার একটি খুব সহজ উপায় যা একটি সংলগ্ন ঘুম / বিরামের মতো 'অনুভব করে' তবে এটি জায়েজ এসএসএন কোড legit

// Create a simple pause function
const pause = (timeoutMsec) => new Promise(resolve => setTimeout(resolve,timeoutMsec))

async function main () {
    console.log('starting');
    // Call with await to pause.  Note that the main function is declared asyc
    await pause(3*1000)
    console.log('done');
}


1

আপনি সরল জাভাস্ক্রিপ্ট ব্যবহার করতে পারেন, এটি 5 সেকেন্ডের পরে আপনার ফাংশন / পদ্ধতিতে কল করবে:

setTimeout(()=> { your_function(); }, 5000);

0

এই সমস্যাটি সমাধান করার বিভিন্ন উপায় রয়েছে। আমরা যদি setTimeoutফাংশনটি ব্যবহার করি তবে প্রথমে এটি জেনে নেওয়া যাক। এই ফাংশনে তিনটি পরামিতি রয়েছে: functionবা code, delay(মিলিসেকেন্ডে) এবং parameters। যেহেতু ফাংশন বা কোড প্যারামিটার প্রয়োজনীয়, অন্যগুলি ,চ্ছিক। একবার দেরি না করে , এটা শুন্যতে সেট করা হবে না।

আরও তথ্যের setTimeout() জন্য এই লিঙ্কে যান

সরলীকৃত সংস্করণ:

var a = 1 + 3;
var b;
console.log('a = ' + a);
setTimeout(function(){ 
    b = a + 4; 
    console.log('b = ' + b);
}, 1000);

আউটপুট:
a = 4
24 -> সক্রিয় টাইমআউটগুলির তালিকার নম্বর সনাক্তকারী
b = 8


প্যারামিটার পাস ব্যবহার করে:

var a = 1 + 3;
var b;
console.log('a = ' + a);
setTimeout(myFunction, 1000, a);

function myFunction(a)
{
    var b = a + 4;
    console.log('b = ' + b);
}

আউটপুট:
a = 4
25 -> সক্রিয় টাইমআউটগুলির তালিকার নম্বর সনাক্তকারী
b = 8



ব্রাউজার সমর্থন:

ক্রোম ফায়ারফক্স এজ সাফারি অপেরা
1.0 1.0 4.0 1.0 4.0

0

এটি আমার মডেল যা জেনারেটর ফাংশন (ES6) ব্যবহার করে জাভাস্ক্রিপ্টে "ঘুম" বা "DoEvents" কীভাবে তা দেখায়। মন্তব্য করা কোড:

<html>
<head>
<script>
  "use strict"; // always
  // Based on post by www-0av-Com /programming/3143928
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
  var divelt, time0, globaln = 0; // global variables
  var MainGenObj = Main(); // generator object = generator function()
window.onload = function() {
  divelt = document.getElementsByTagName("body")[0]; // for addline()
  addline("typeof Main: " + typeof Main);
  addline("typeof MainDriver: " + typeof MainDriver);
  addline("typeof MainGenObj: " + typeof MainGenObj);
  time0 = new Date().valueOf(); // starting time ms
  MainDriver(); // do all parts of Main()
}
function* Main() { // this is "Main" -- generator function -- code goes here
  // could be loops, or inline, like this:

  addline("Part A, time: " + time() + ", " + ++globaln); // part A
  yield 2000;                    // yield for 2000 ms (like sleep)

  addline("Part B, time: " + time() + ", " +  ++globaln); // part B
  yield 3000;                    // yield for 3000 ms (or like DoEvents)

  addline("Part Z, time: " + time() + ", " +  ++globaln); // part Z (last part)
  addline("End, time: " + time());
}
function MainDriver() { // this does all parts, with delays
  var obj = MainGenObj.next(); // executes the next (or first) part of Main()
  if (obj.done == false) { // if "yield"ed, this will be false
    setTimeout(MainDriver, obj.value); // repeat after delay
  }
}
function time() { // seconds from time0 to 3 decimal places
  var ret = ((new Date().valueOf() - time0)/1000).toString();
  if (ret.indexOf(".") == -1) ret += ".000";
  while (ret.indexOf(".") >= ret.length-3) ret += "0";
  return ret;
}
function addline(what) { // output
  divelt.innerHTML += "<br />\n" + what;
}
</script>
</head>
<body>
<button onclick="alert('I\'m alive!');"> Hit me to see if I'm alive </button>
</body>
</html>

0

এই ফাংশনটি ব্যবহার করে দেখুন:

const delay = (ms, cb) => setTimeout(cb, ms)

আপনি এটি কীভাবে ব্যবহার করবেন তা এখানে:

console.log("Waiting for 5 seconds.")
delay(5000, function() {
  console.log("Finished waiting for 5 seconds.")
})

বা প্রতিশ্রুতি স্টাইল যান:

const delay = ms => new Promise(resolve => {
    setTimeout(resolve, ms)
})

এখানে একটি ডেমো রয়েছে

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