আমি কীভাবে একটি জাভাস্ক্রিপ্ট লুপে একটি বিলম্ব যুক্ত করব?


345

আমি একটি whileলুপের মধ্যে একটি বিলম্ব / ঘুম যুক্ত করতে চাই :

আমি এটির মতো চেষ্টা করেছি:

alert('hi');

for(var start = 1; start < 10; start++) {
  setTimeout(function () {
    alert('hello');
  }, 3000);
}

কেবলমাত্র প্রথম দৃশ্যটি সত্য: দেখানোর পরে alert('hi')এটি 3 সেকেন্ডের জন্য অপেক্ষা alert('hello')করবে তারপরে প্রদর্শিত alert('hello')হবে তবে তারপরে বারবার ধারাবাহিকভাবে প্রদর্শিত হবে।

আমি যা চাই তা হল যে এর পরে alert('hello')3 সেকেন্ড প্রদর্শিত alert('hi')হবে তারপরে দ্বিতীয় বারের জন্য এটি 3 সেকেন্ড অপেক্ষা করতে হবে alert('hello')এবং এ জাতীয় কিছু।

উত্তর:


749

setTimeout()ফাংশন অ অবরুদ্ধ করে এবং অবিলম্বে ফিরে আসবে। অতএব আপনার লুপটি খুব দ্রুত পুনরাবৃত্তি হবে এবং এটি দ্রুত ধারাবাহিকতায় একের পর এক 3-দ্বিতীয় সময়সীমা ট্রিগার শুরু করবে। এজন্য আপনার প্রথম সতর্কতাগুলি 3 সেকেন্ড পরে পপ আপ হয় এবং বাকি সমস্তগুলি কোনও দেরি না করে পর পর অনুসরণ করে।

পরিবর্তে আপনি এর মতো কিছু ব্যবহার করতে চাইতে পারেন:

var i = 1;                  //  set your counter to 1

function myLoop() {         //  create a loop function
  setTimeout(function() {   //  call a 3s setTimeout when the loop is called
    console.log('hello');   //  your code here
    i++;                    //  increment the counter
    if (i < 10) {           //  if the counter < 10, call the loop function
      myLoop();             //  ..  again which will trigger another 
    }                       //  ..  setTimeout()
  }, 3000)
}

myLoop();                   //  start the loop

একটি স্ব-চালিত ক্রিয়াকলাপটি ব্যবহার করে, পুনরাবৃত্তির সংখ্যাটি আর্গুমেন্ট হিসাবে পাস করেও আপনি এটি পরিষ্কার করতে পারেন:

(function myLoop(i) {
  setTimeout(function() {
    console.log('hello'); //  your code here                
    if (--i) myLoop(i);   //  decrement i and call myLoop again if i > 0
  }, 3000)
})(10);                   //  pass the number of iterations as an argument


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

7
@ অ্যাডাম: আমার উপলব্ধিটি হ'ল যেহেতু সেটটাইমআউট অ-ব্লকিং, তাই এটি পুনরুদ্ধার নয় - স্ট্যাক উইন্ডো প্রতিটি সেটটাইমআউট পরে বন্ধ হয় এবং কেবলমাত্র একটি সেট টাইমআউট কার্যকর করার জন্য অপেক্ষা করে থাকে ... তাই না?
জো

3
for inলুপের মতো কোনও বস্তুর পুনরাবৃত্তি করার সময় এটি কীভাবে কাজ করবে ?
vsync

1
@vsync দেখুনObject.keys()
ব্র্যাডেন বেস্ট

1
@joey আপনি বিভ্রান্তিকর হয় setTimeoutসঙ্গে setInterval। কলব্যাক কল করা হলে টাইমআউট সুস্পষ্টভাবে ধ্বংস হয়।
cdowie

72

এরকম কিছু চেষ্টা করুন:

var i = 0, howManyTimes = 10;
function f() {
    alert( "hi" );
    i++;
    if( i < howManyTimes ){
        setTimeout( f, 3000 );
    }
}
f();

69

ES6 ব্যবহার করে, আপনি letএটি অর্জন করতে ব্যবহার করতে পারেন :

for (let i=1; i<10; i++) {
    setTimeout( function timer(){
        alert("hello world");
    }, i*3000 );
}

কি letকরে ঘোষণা করা হয় iপ্রত্যেকের জন্য পুনরাবৃত্তির না লুপ। এইভাবে, যা পাস হয় তা হ'ল setTimeoutআমরা যা চাই।


1
ধন্যবাদ! এই পদ্ধতিটি আমার নিজের মতো করে ভাবেন না। আসল ব্লক স্কোপিং। তা কল্পনা করুন ...
সোফিয়া গোল্ড

1
আমি বিশ্বাস করি এই উত্তর বর্ণিত একই মেমরি অ্যালোকেশন বিষয় আছে stackoverflow.com/a/3583795/1337392
Flame_Phoenix

1
@ ফ্লেমে_ফোনিক্স কোন মেমোরি বরাদ্দ দেয়?
ক্যাসেল

1
সেটটাইমআউট কলটি সুসংগতভাবে i*3000লুপের অভ্যন্তরে আর্গুমেন্টের মান গণনা করে এবং মান setTimeoutদ্বারা এটি পাস করে । এর ব্যবহারটি letalচ্ছিক এবং প্রশ্ন এবং উত্তরের সাথে সম্পর্কিত নয়।
traktor53

@ ফ্লেম_ফোনিক্স উল্লেখ করেছেন যে এই কোডটিতে সমস্যা রয়েছে। মূলত প্রথম পাসে আপনি টাইমার তৈরি করেন তারপরে তাত্ক্ষণিকভাবে লুপটি পুনরায় পুনরায় পুনরায় পুনরায় পুনরায় পুনরুক্ত করুন শর্ত দ্বারা লুপ শেষ না হওয়া পর্যন্ত (যেমন i < 10) আপনার একাধিক টাইমার সমান্তরালে কাজ করবে যা মেমরি বরাদ্দ তৈরি করে এবং এটি বৃহত্তর পরিমাণে পুনরাবৃত্তির চেয়েও খারাপ।
এক্সক্যানজি

63

যেহেতু ES7 একটি ভাল উপায় Theres অপেক্ষা একটি লুপ:

// Returns a Promise that resolves after "ms" Milliseconds
function timer(ms) {
 return new Promise(res => setTimeout(res, ms));
}

async function load () { // We need to wrap the loop into an async function for this to work
  for (var i = 0; i < 3; i++) {
    console.log(i);
    await timer(3000); // then the created Promise can be awaited
  }
}

load();

ইঞ্জিনটি awaitঅংশে পৌঁছালে এটি একটি সময়সীমা নির্ধারণ করে এবং এর কার্য সম্পাদন বন্ধ করে দেয়async function । তারপরে সময়সীমা সমাপ্ত হলে, কার্যকরভাবে সেই সময়ে কার্যকর হয় at এটি বেশ কার্যকর কারণ আপনি (1) নেস্টেড লুপগুলি (2) শর্তাধীন, (3) নেস্টেড ফাংশনগুলি বিলম্ব করতে পারেন:

async function task(i) { // 3
  await timer(1000);
  console.log(`Task ${i} done!`);
}

async function main() {
  for(let i = 0; i < 100; i+= 10) {
    for(let j = 0; j < 10; j++) { // 1
      if(j % 2) { // 2
        await task(i + j);
      }
    }
  }
}
    
main();

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

এমডিএন-তে রেফারেন্স

ES7 এখন নোডজেএস এবং আধুনিক ব্রাউজারগুলির দ্বারা সমর্থিত রয়েছে, আপনি সম্ভবত এটি ব্যাবেলজেএস দিয়ে স্থানান্তর করতে চাইতে পারেন যাতে এটি সর্বত্র চলে।


এটা আমার জন্য ভালই কাজ করে। আমি কেবল জিজ্ঞাসা করতে চাই যে আমি লুপটি ভাঙতে চাই, অপেক্ষা করার সময় আমি কীভাবে এটি করতে পারি?
শচিন শাহ

@ সাচিন break;হয়ত?
জোনাস উইলমস

এই সমাধানের জন্য ধন্যবাদ। সমস্ত বিদ্যমান নিয়ন্ত্রণ কাঠামো ব্যবহার করা ভাল এবং ধারাবাহিকতা আবিষ্কার করার প্রয়োজন নেই।
গস

এটি এখনও বিভিন্ন টাইমার তৈরি করতে পারে এবং তারা ক্রমের পরিবর্তে বিভিন্ন সময়ে সমাধান করবে?
ডেভিড ইয়েল

@ ডেভিড উম নাপ? আপনি কি আসলে কোড চালাচ্ছেন?
জোনাস উইলস

24

আরেকটি উপায় হ'ল সময়কে শেষ করার গুণকে বাড়িয়ে দেওয়া, তবে মনে রাখবেন যে এটি ঘুমের মতো নয় । লুপের পরে কোডটি তাত্ক্ষণিকভাবে কার্যকর করা হবে, কেবলমাত্র কলব্যাক ফাংশনটি কার্যকর করা স্থগিত।

for (var start = 1; start < 10; start++)
    setTimeout(function () { alert('hello');  }, 3000 * start);

প্রথম টাইমআউট সেট করা হবে 3000 * 1, দ্বিতীয় থেকে 3000 * 2এবং আরও কিছু।


2
এটি উল্লেখ করার মতো যে আপনি startএই পদ্ধতিটি ব্যবহার করে আপনার ফাংশনটির ভিতরে নির্ভরযোগ্যভাবে ব্যবহার করতে পারবেন না ।
ডিবিএস

2
খারাপ অনুশীলন - অপ্রয়োজনীয় স্মৃতি বরাদ্দ।
আলেকজান্ডার ট্রাখিমেনোক

সৃজনশীলতার জন্য উত্সাহ দেওয়া, কিন্তু এটি খারাপ অভ্যাস। :)
সালভান

2
এটি কেন একটি খারাপ অনুশীলন, এবং কেন এতে মেমরি বরাদ্দ সংক্রান্ত সমস্যা রয়েছে? এই উত্তর একই সমস্যা ভোগ করে? stackoverflow.com/a/36018502/1337392
Flame_Phoenix

1
@ ফ্লেমে_ফোনিক্স এটি খারাপ অনুশীলন কারণ প্রোগ্রামটি প্রতিটি লুপের জন্য একটি টাইমার রাখবে এবং একই সাথে সমস্ত টাইমার চলমান থাকবে। সুতরাং যদি 1000 পুনরুক্তি হয় তবে শুরুতে একই সময়ে 1000 টি টাইমার চলমান থাকবে।
জোয়াকিম

16

এটি কাজ করবে

for (var i = 0; i < 10; i++) {
  (function(i) {
    setTimeout(function() { console.log(i); }, 100 * i);
  })(i);
}

এই ঝাঁকুনিটি ব্যবহার করে দেখুন: https://jsfiddle.net/wgdx8zqq/


1
এটি একই সময়ে অলআউট কলগুলি ট্রিগার করে যদিও
এডি 19

কেবলমাত্র আমি বলি, আমি এইভাবে ফাটল ধরেছি, ব্যবহার করেছি $.Deferredতবে এটি কাজ করার জন্য এটি কিছু আলাদা পরিস্থিতি ছিল, আপনার থাম্বস ..!
আরিফ মোস্তফা

15

আমার মনে হয় এরকম কিছু আপনার দরকার:

var TimedQueue = function(defaultDelay){
    this.queue = [];
    this.index = 0;
    this.defaultDelay = defaultDelay || 3000;
};

TimedQueue.prototype = {
    add: function(fn, delay){
        this.queue.push({
            fn: fn,
            delay: delay
        });
    },
    run: function(index){
        (index || index === 0) && (this.index = index);
        this.next();
    },
    next: function(){
        var self = this
        , i = this.index++
        , at = this.queue[i]
        , next = this.queue[this.index]
        if(!at) return;
        at.fn();
        next && setTimeout(function(){
            self.next();
        }, next.delay||this.defaultDelay);
    },
    reset: function(){
        this.index = 0;
    }
}

পরীক্ষার কোড:

var now = +new Date();

var x = new TimedQueue(2000);

x.add(function(){
    console.log('hey');
    console.log(+new Date() - now);
});
x.add(function(){
    console.log('ho');
    console.log(+new Date() - now);
}, 3000);
x.add(function(){
    console.log('bye');
    console.log(+new Date() - now);
});

x.run();

দ্রষ্টব্য: আপনি সতর্কতা বন্ধ না করা পর্যন্ত সতর্কতা ব্যবহার করে জাভাস্ক্রিপ্ট কার্যকর করা হয়। এটি আপনার চেয়ে বেশি কোড হতে পারে তবে এটি একটি শক্তিশালী পুনরায় ব্যবহারযোগ্য সমাধান।


15

আমি সম্ভবত ব্যবহার করতে হবে setInteval। এটার মত,

var period = 1000; // ms
var endTime = 10000;  // ms
var counter = 0;
var sleepyAlert = setInterval(function(){
    alert('Hello');
    if(counter === endTime){
       clearInterval(sleepyAlert);
    }
    counter += period;
}, period);

3
সেটটাইমআউট সেটেলটারওয়ালের চেয়ে অনেক ভাল। এটি গুগল করুন এবং আপনি জানতে পারবেন
এয়ারি

14
আমি এটিকে কিছুটা গুগল করেছিলাম এবং কিছুই দেখতে পেলাম না কেন সেটইন্টারভাল খারাপ? আপনি আমাদের একটি লিঙ্ক দিতে পারেন? বা একটি উদাহরণ? ধন্যবাদ
মার্কস

আমি বিন্দু ছিল SetInterval()ডিম ছাড়ার 'থ্রেড' এমনকি কিছু ত্রুটি অথবা অবরোধ ঘটনা রাখে।
মতিন উলহাক

8

ES6 (ECMAScript 2015) এ আপনি জেনারেটর এবং বিরতি দিয়ে দেরি করে পুনরাবৃত্তি করতে পারেন ।

জেনারেটর, ইসমাস্ক্রিপ্ট of এর একটি নতুন বৈশিষ্ট্য, এমন ফাংশন যা বিরতি দিয়ে আবার শুরু করা যেতে পারে। GenFunc কল করা এটি কার্যকর করে না। পরিবর্তে, এটি একটি তথাকথিত জেনারেটর অবজেক্ট দেয় যা আমাদের জেনফুঙ্কের সম্পাদন নিয়ন্ত্রণ করতে দেয়। জেনফুঙ্ক () প্রাথমিকভাবে তার দেহের শুরুতে স্থগিত করা হয়। GenObj.next () পদ্ধতিটি পরবর্তী ফলন না হওয়া পর্যন্ত জেনফুঙ্কের প্রয়োগ চালিয়ে যায়। (ES6 অন্বেষণ)


কোড উদাহরণ:

let arr = [1, 2, 3, 'b'];
let genObj = genFunc();

let val = genObj.next();
console.log(val.value);

let interval = setInterval(() => {
  val = genObj.next();
  
  if (val.done) {
    clearInterval(interval);
  } else {
    console.log(val.value);
  }
}, 1000);

function* genFunc() {
  for(let item of arr) {
    yield item;
  }
}

সুতরাং আপনি যদি ES6 ব্যবহার করে থাকেন তবে দেরি করে লুপ অর্জনের জন্য এটি সবচেয়ে মার্জিত উপায় (আমার মতের জন্য)।


4

আপনি আরএক্সজেএস ইন্টারভাল অপারেটর ব্যবহার করতে পারেন । বিরতি প্রতিটি সেকেন্ডের প্রতিটি সংখ্যার পূর্ণসংখ্যার নির্গমন করে এবং এটি সংখ্যার নির্গমন করতে কত সময় নির্ধারণ করে তা নির্ধারণ করে

Rx.Observable
  .interval(1000)
  .take(10)
  .subscribe((x) => console.log(x))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.lite.min.js"></script>


4

ভেবেছিলাম আমি এখানে আমার দুটি সেন্ট পোস্ট করব। এই ফাংশনটি একটি বিলম্ব সহ একটি পুনরাবৃত্তি লুপ চালায়। এই jsfiddle দেখুন । ফাংশনটি নিম্নরূপ:

function timeout(range, time, callback){
    var i = range[0];                
    callback(i);
    Loop();
    function Loop(){
        setTimeout(function(){
            i++;
            if (i<range[1]){
                callback(i);
                Loop();
            }
        }, time*1000)
    } 
}

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

//This function prints the loop number every second
timeout([0, 5], 1, function(i){
    console.log(i);
});

সমান হবে:

//This function prints the loop number instantly
for (var i = 0; i<5; i++){
    console.log(i);
}

4

আমি এটি ব্লুবার্ড Promise.delayএবং পুনরাবৃত্তি দিয়ে করি।

function myLoop(i) {
  return Promise.delay(1000)
    .then(function() {
      if (i > 0) {
        alert('hello');
        return myLoop(i -= 1);
      }
    });
}

myLoop(3);
<script src="//cdnjs.cloudflare.com/ajax/libs/bluebird/2.9.4/bluebird.min.js"></script>


2

ES6 এ আপনি নিম্নলিখিত হিসাবে করতে পারেন:

 for (let i = 0; i <= 10; i++){       
     setTimeout(function () {   
        console.log(i);
     }, i*3000)
 }

ES5 এ আপনি এটি করতে পারেন:

for (var i = 0; i <= 10; i++){
   (function(i) {          
     setTimeout(function () {   
        console.log(i);
     }, i*3000)
   })(i);  
 }

কারণটি হ'ল, letআপনাকে এমন ভেরিয়েবলগুলি ঘোষণা করতে দেয় যা কোনও ব্লক স্টেটমেন্টের স্কোপের মধ্যে সীমাবদ্ধ, বা অভিব্যক্তি, যার উপর এটি ব্যবহৃত হয়, varকীওয়ার্ডের বিপরীতে যা বিশ্বব্যাপী একটি ভেরিয়েবলকে সংজ্ঞায়িত করে, বা স্থানীয়ভাবে ব্লক স্কোপ নির্বিশেষে পুরো ফাংশনে স্থানীয়ভাবে নির্ধারণ করে।


1

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

প্রথমে কিছু প্রয়োজনীয় ভেরিয়েবল সংজ্ঞায়িত করা যাক:

var startIndex = 0;
var data = [1, 2, 3];
var timeout = 3000;

পরবর্তী আপনি যে ফাংশনটি চালাতে চান তা নির্ধারণ করা উচিত। এটি আপনাকে প্রয়োজন হলে লুপের বর্তমান সূচক এবং লুপের দৈর্ঘ্যটি উত্তীর্ণ হবে:

function functionToRun(i, length) {
    alert(data[i]);
}

স্ব-সম্পাদনকারী সংস্করণ

(function forWithDelay(i, length, fn, delay) {
   setTimeout(function () {
      fn(i, length);
      i++;
      if (i < length) {
         forWithDelay(i, length, fn, delay); 
      }
  }, delay);
})(startIndex, data.length, functionToRun, timeout);

কার্যকরী সংস্করণ

function forWithDelay(i, length, fn, delay) {
   setTimeout(function () {
      fn(i, length);
      i++;
      if (i < length) {
         forWithDelay(i, length, fn, delay); 
      }
  }, delay);
}

forWithDelay(startIndex, data.length, functionToRun, timeout); // Lets run it

একটি সুন্দর এবং আমি কীভাবে গ্লোবাল ভেরিয়েবল ছাড়াই ফাংশনে ডেটা পাস করব
সুন্দ্রা প্রাবু


1

তুমি এটা কর:

console.log('hi')
let start = 1
setTimeout(function(){
  let interval = setInterval(function(){
    if(start == 10) clearInterval(interval)
    start++
    console.log('hello')
  }, 3000)
}, 3000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


সতর্কতাগুলির পরিবর্তে কনসোল লগগুলি ব্যবহার করা ভাল, অর্ধ মিনিটের জন্য সতর্কতাগুলি বন্ধ করা খুব মজাদার ছিল না;)
হেন্ড্রি

হ্যাঁ। আমি দেখি! তবে অনুরোধটি সতর্কতা অবলম্বন ... হুজ
বা ডানহ - এফএইচ এইচএন

কেন jQuery আমদানি?
ইলিয়াস সোরেস

দুঃখিত ... এটা অপ্রয়োজনীয় .. হি। আমি পোস্টের সামগ্রী জানি না ... এটি প্রথম।
এনগুইন বা ডানহ - এফএইচ এইচএন

0
/* 
  Use Recursive  and setTimeout 
  call below function will run loop loopFunctionNeedCheck until 
  conditionCheckAfterRunFn = true, if conditionCheckAfterRunFn == false : delay 
  reRunAfterMs miliseconds and continue loop
  tested code, thanks
*/

function functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn,
 loopFunctionNeedCheck) {
    loopFunctionNeedCheck();
    var result = conditionCheckAfterRunFn();
    //check after run
    if (!result) {
        setTimeout(function () {
            functionRepeatUntilConditionTrue(reRunAfterMs, conditionCheckAfterRunFn, loopFunctionNeedCheck)
        }, reRunAfterMs);
    }
    else  console.log("completed, thanks");    
            //if you need call a function after completed add code call callback in here
}

//passing-parameters-to-a-callback-function
// From Prototype.js 
if (!Function.prototype.bind) { // check if native implementation available
    Function.prototype.bind = function () {
        var fn = this, args = Array.prototype.slice.call(arguments),
            object = args.shift();
        return function () {
            return fn.apply(object,
              args.concat(Array.prototype.slice.call(arguments)));
        };
    };
}

//test code: 
var result = 0; 
console.log("---> init result is " + result);
var functionNeedRun = function (step) {           
   result+=step;    
       console.log("current result is " + result);  
}
var checkResultFunction = function () {
    return result==100;
}  

//call this function will run loop functionNeedRun and delay 500 miliseconds until result=100    
functionRepeatUntilConditionTrue(500, checkResultFunction , functionNeedRun.bind(null, 5));

//result log from console:
/*
---> init result is 0
current result is 5
undefined
current result is 10
current result is 15
current result is 20
current result is 25
current result is 30
current result is 35
current result is 40
current result is 45
current result is 50
current result is 55
current result is 60
current result is 65
current result is 70
current result is 75
current result is 80
current result is 85
current result is 90
current result is 95
current result is 100
completed, thanks
*/

7
আপনার ফাংশনের নামগুলি ভয়াবহ, কারণ এই কোডটি পড়তে এত কঠিন।
মার্ক ওয়াল্টার্স

0

এখানে একটি বিলম্বের সাথে আমি একটি অসীম লুপ তৈরি করেছি যা একটি নির্দিষ্ট শর্তে বিরতি দেয়:

  // Now continuously check the app status until it's completed, 
  // failed or times out. The isFinished() will throw exception if
  // there is a failure.
  while (true) {
    let status = await this.api.getStatus(appId);
    if (isFinished(status)) {
      break;
    } else {
      // Delay before running the next loop iteration:
      await new Promise(resolve => setTimeout(resolve, 3000));
    }
  }

এখানে কীটি হ'ল একটি নতুন প্রতিশ্রুতি তৈরি করা যা সময়সীমা অনুসারে সমাধান হয় এবং এর সমাধানের জন্য অপেক্ষা করা।

স্পষ্টতই আপনার এটির জন্য এসিএনসি / সমর্থনটির জন্য অপেক্ষা করা উচিত। নোড 8 এ কাজ করে।


0

সাধারণ ব্যবহারের জন্য "সাধারণ লুপগুলি ভুলে যান" এবং "সেটইন্টারভাল" এর এই সংমিশ্রণটি ব্যবহার করে "সেটটাইমআউট" গুলি অন্তর্ভুক্ত থাকে: এটির মতো (আমার আসল কাজগুলি থেকে)।

        function iAsk(lvl){
            var i=0;
            var intr =setInterval(function(){ // start the loop 
                i++; // increment it
                if(i>lvl){ // check if the end round reached.
                    clearInterval(intr);
                    return;
                }
                setTimeout(function(){
                    $(".imag").prop("src",pPng); // do first bla bla bla after 50 millisecond
                },50);
                setTimeout(function(){
                     // do another bla bla bla after 100 millisecond.
                    seq[i-1]=(Math.ceil(Math.random()*4)).toString();
                    $("#hh").after('<br>'+i + ' : rand= '+(Math.ceil(Math.random()*4)).toString()+' > '+seq[i-1]);
                    $("#d"+seq[i-1]).prop("src",pGif);
                    var d =document.getElementById('aud');
                    d.play();                   
                },100);
                setTimeout(function(){
                    // keep adding bla bla bla till you done :)
                    $("#d"+seq[i-1]).prop("src",pPng);
                },900);
            },1000); // loop waiting time must be >= 900 (biggest timeOut for inside actions)
        }

পিএস: বুঝুন যে (সেটটাইমআউট) এর আসল আচরণ: তারা সবাই একই সাথে শুরু হবে "তিন ব্লে ব্লা একই মুহুর্তে গণনা শুরু করবে" সুতরাং মৃত্যুদন্ড কার্যকর করার ব্যবস্থা করার জন্য আলাদা সময়সীমা তৈরি করুন।

পিএস 2: টাইমিং লুপের উদাহরণ, তবে একটি প্রতিক্রিয়ার লুপগুলির জন্য আপনি ইভেন্টগুলি ব্যবহার করতে পারেন, আশ্বাস দেওয়ার আশ্বাস দিন ..


0

<!DOCTYPE html>
<html>
<body>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {
    for(var i=0; i<5; i++) {
    	var sno = i+1;
       	(function myLoop (i) {          
             setTimeout(function () {   
             	alert(i); // Do your function here 
             }, 1000*i);
        })(sno);
    }
}
</script>

</body>
</html>


1
দয়া করে সবসময় আপনার কোড স্নিপেট করতে অন্তত সংক্ষিপ্ত বিবরণ প্রদান অন্যান্যের নিশ্চিত করুন যে আপনি হতে অন্তত জন্য মোকাবেলার প্রশ্ন।
হেক্সফায়ার 23'18

1
কোড শুধুমাত্র উত্তর উৎসাহিত arent যেমন তারা অনেক তথ্য প্রদান আত ভবিষ্যৎ পাঠকদের জন্য খুশি কি আপনি লিখেছি কিছু ব্যাখ্যা প্রদান
WhatsThePoint

0

আমার জ্ঞান অনুসারে setTimeoutফাংশনটিকে বলা হয় অ্যাসিঙ্ক্রোনাসলি। আপনি যা করতে পারেন তা হ'ল Promiseএসিঙ্ক ফাংশনটির মধ্যে পুরো লুপটি আবৃত করা এবং সেট টাইমআউট সমেত এমন একটিটির জন্য অপেক্ষা করা যা দেখানো হয়েছে:

var looper = async function () {
  for (var start = 1; start < 10; start++) {
    await new Promise(function (resolve, reject) {
      setTimeout(function () {
        console.log("iteration: " + start.toString());
        resolve(true);
      }, 1000);
    });
  }
  return true;
}

এবং তারপরে আপনি এটিকে এভাবে চালান বলুন:

looper().then(function(){
  console.log("DONE!")
});

অ্যাসিক্রোনাস প্রোগ্রামিং সম্পর্কে ভাল ধারণা পেতে দয়া করে কিছুটা সময় নিন।


0

শুধু এই চেষ্টা করুন

 var arr = ['A','B','C'];
 (function customLoop (arr, i) {
    setTimeout(function () {
    // Do here what you want to do.......
    console.log(arr[i]);
    if (--i) {                
      customLoop(arr, i); 
    }
  }, 2000);
})(arr, arr.length);

ফলাফল

A // after 2s
B // after 2s
C // after 2s

-1

এখানে একটি ফাংশন যা আমি অ্যারের উপরে লুপিংয়ের জন্য ব্যবহার করি:

function loopOnArrayWithDelay(theArray, delayAmount, i, theFunction, onComplete){

    if (i < theArray.length && typeof delayAmount == 'number'){

        console.log("i "+i);

        theFunction(theArray[i], i);

        setTimeout(function(){

            loopOnArrayWithDelay(theArray, delayAmount, (i+1), theFunction, onComplete)}, delayAmount);
    }else{

        onComplete(i);
    }
}

আপনি এটি এর মতো ব্যবহার করুন:

loopOnArrayWithDelay(YourArray, 1000, 0, function(e, i){
    //Do something with item
}, function(i){
    //Do something once loop has completed
}

-1

এই স্ক্রিপ্ট বেশিরভাগ জিনিসের জন্য কাজ করে

function timer(start) {
    setTimeout(function () { //The timer
        alert('hello');
    }, start*3000); //needs the "start*" or else all the timers will run at 3000ms
}

for(var start = 1; start < 10; start++) {
    timer(start);
}

-1

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

var icount=0;
for (let i in items) {
   icount=icount+1000;
   new beginCount(items[i],icount);
}

function beginCount(item,icount){
  setTimeout(function () {

   new actualFunction(item,icount);

 }, icount);
}

function actualFunction(item,icount){
  //...runs ever 1 second
 console.log(icount);
}

-1

লুপ চলছে যতক্ষণ না প্রতি দুই সেকেন্ডে পাঠ্যের একটি টুকরো দেখানোর সহজ বাস্তবায়ন।

for (var i = 0; i < foo.length; i++) {
   setInterval(function(){ 
     console.log("I will appear every 2 seconds"); 
   }, 2000);
  break;
};

-3

এটা চেষ্টা কর

//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);
  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.