চলমান চলাকালীন সেটআইন্টারওয়ালের ব্যবধান পরিবর্তন করা


161

আমি একটি জাভাস্ক্রিপ্ট ফাংশন লিখেছি যা নির্দিষ্ট সংখ্যার পুনরাবৃত্তির জন্য একটি সেকেন্ডের দশম দশকে একটি স্ট্রিং ম্যানিপুলেট করতে setInterval ব্যবহার করে।

function timer() {
    var section = document.getElementById('txt').value;
    var len = section.length;
    var rands = new Array();

    for (i=0; i<len; i++) {
        rands.push(Math.floor(Math.random()*len));
    };

    var counter = 0
    var interval = setInterval(function() {
        var letters = section.split('');
        for (j=0; j < len; j++) {
            if (counter < rands[j]) {
                letters[j] = Math.floor(Math.random()*9);
            };
        };
        document.getElementById('txt').value = letters.join('');
        counter++

        if (counter > rands.max()) {
            clearInterval(interval);
        }
    }, 100);
};

একটি নির্দিষ্ট সংখ্যায় অন্তর সেট করার পরিবর্তে, আমি কাউন্টারের উপর ভিত্তি করে প্রতিবার এটি চলার সময় আপডেট করতে চাই। এর পরিবর্তে:

var interval = setInterval(function() { ... }, 100);

এটি এমন কিছু হবে:

var interval = setInterval(function() { ... }, 10*counter);

দুর্ভাগ্যক্রমে, এটি কার্যকর হয়নি। দেখে মনে হয়েছিল "10 * কাউন্টার" 0 এর সমান।

সুতরাং, বেনামি ফাংশন প্রতিবার চলার সাথে সাথে আমি কীভাবে অন্তর সামঞ্জস্য করতে পারি?

উত্তর:


107

setTimeout()পরিবর্তে ব্যবহার করুন। কলব্যাকটি পরবর্তী সময় শেষ হওয়ার জন্য গুলি চালানোর জন্য দায়বদ্ধ হবে, যার সময়ে আপনি সময় বাড়াতে বা অন্যথায় হেরফের করতে পারেন।

সম্পাদনা

এখানে কোনও জেনেরিক ফাংশন যা আপনি যে কোনও ফাংশন কলের জন্য "বিভ্রান্তিকর" টাইমআউট প্রয়োগ করতে ব্যবহার করতে পারেন।

function setDeceleratingTimeout(callback, factor, times)
{
    var internalCallback = function(tick, counter) {
        return function() {
            if (--tick >= 0) {
                window.setTimeout(internalCallback, ++counter * factor);
                callback();
            }
        }
    }(times, 0);

    window.setTimeout(internalCallback, factor);
};

// console.log() requires firebug    
setDeceleratingTimeout(function(){ console.log('hi'); }, 10, 10);
setDeceleratingTimeout(function(){ console.log('bye'); }, 100, 10);

1
কলব্যাকের মাধ্যমে, আপনি কি ফাংশনের শেষ লাইনটি সেট টাইমআউট (..., নতুন অন্তর্গত) দিয়ে নিজেকে পুনরাবৃত্তভাবে কল করেন?
মার্ক

1
আমি ধরে নিলাম সেটাই তার বোঝাতে চেয়েছিল। আমি এটি চেষ্টা করেছি এবং মনে হচ্ছে এটি কাজ করছে। ধন্যবাদ বন্ধুরা!
জো দি স্টেফানো

2
কেবল 9 হাই এর দেয় :) --tসম্ভবত t-- jsfiddle.net/albertjan/by5fd
আলবার্টজান

1
এটি পুনরাবৃত্তভাবে করা আপনি timesখুব বড় হলে স্ট্যাক ওভারফ্লো ত্রুটি হওয়ার ঝুঁকিটি চালান না ?
আন্দ্রে সি। অ্যান্ডারসন

4
এখানে নিটপিকি হচ্ছে, তবে আমি বলতে চাই, এই কোডটি পড়া বেশ শক্ত। আপনি যদি পরের-লাইনের ধনুর্বন্ধনী ব্যবহার করতে চান তবে কমপক্ষে 4-8-স্পেস ইনডেন্টেশন ব্যবহার করার বা কখনও 2 ইনডেন্টের বাইরে যেতে পারার শালীনতা নেই। আইএমও এই সংস্করণটি পড়া অনেক সহজ। এছাড়াও এর পুনঃনামকরনের নোট নিতে tকরার tick, যা যাই হোক না কেন "টি" জন্য দাঁড়ানো অনুমিত হয় হিসেবে আমার সবচেয়ে ভালো অনুমান ছিল। tএকটি খুব খারাপ পরিবর্তনশীল নাম।
ব্র্যাডেন সেরা

124

আপনি একটি বেনামী ফাংশন ব্যবহার করতে পারেন:

var counter = 10;
var myFunction = function(){
    clearInterval(interval);
    counter *= 10;
    interval = setInterval(myFunction, counter);
}
var interval = setInterval(myFunction, counter);

আপডেট: এ। ওল্ফের পরামর্শ অনুসারে, setTimeoutপ্রয়োজনীয়তা এড়াতে ব্যবহার করুন clearInterval

var counter = 10;
var myFunction = function() {
    counter *= 10;
    setTimeout(myFunction, counter);
}
setTimeout(myFunction, counter);

5
আচ্ছা রোজা, আমার উত্তরটি সেপ্টেম্বর 16 '11-এ এবং ব্যবহারকারী 28958 এর আগস্ট 22 '13-এ পোস্ট করা হয়েছিল, তাই আমি "রেপ" ধন্যবাদ নেব!
নিক

12
আপনি কেন অন্তর ব্যবহার করছেন, একটি সাধারণ সময়সীমা এটি পরিষ্কার করার প্রয়োজন ছাড়াই ভাল would উদাহরণস্বরূপ: jsfiddle.net/fgs5nwgn
এ। ওল্ফ

4
আমি প্রশ্নের প্রসঙ্গে আটকে ছিলাম। সেটটাইমআউট অবশ্যই কাজ করবে
নিক

24

আমি এই প্রশ্নটি পছন্দ করি - আমার মধ্যে একটু টাইমার অবজেক্টটি অনুপ্রাণিত করে:

window.setVariableInterval = function(callbackFunc, timing) {
  var variableInterval = {
    interval: timing,
    callback: callbackFunc,
    stopped: false,
    runLoop: function() {
      if (variableInterval.stopped) return;
      var result = variableInterval.callback.call(variableInterval);
      if (typeof result == 'number')
      {
        if (result === 0) return;
        variableInterval.interval = result;
      }
      variableInterval.loop();
    },
    stop: function() {
      this.stopped = true;
      window.clearTimeout(this.timeout);
    },
    start: function() {
      this.stopped = false;
      return this.loop();
    },
    loop: function() {
      this.timeout = window.setTimeout(this.runLoop, this.interval);
      return this;
    }
  };

  return variableInterval.start();
};

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

var vi = setVariableInterval(function() {
  // this is the variableInterval - so we can change/get the interval here:
  var interval = this.interval;

  // print it for the hell of it
  console.log(interval);

  // we can stop ourselves.
  if (interval>4000) this.stop();

  // we could return a new interval after doing something
  return interval + 100;
}, 100);  

// we can change the interval down here too
setTimeout(function() {
  vi.interval = 3500;
}, 1000);

// or tell it to start back up in a minute
setTimeout(function() {
  vi.interval = 100;
  vi.start();
}, 60000);

4
ধন্যবাদ - আমি যেভাবে কাজ করছি তার জন্য আমাকে সঠিক দিকে যাত্রা করুন।
কর্নেল স্পঞ্জস

সহজ এবং কার্যকর। ধন্যবাদ!
জেসেটার

18

মূল পোস্টার হিসাবে আমার একই প্রশ্ন ছিল, এটি সমাধান হিসাবে এটি করেছে। এটি কতটা দক্ষ তা নিশ্চিত নয় ...

interval = 5000; // initial condition
var run = setInterval(request , interval); // start setInterval as "run"

    function request() { 

        console.log(interval); // firebug or chrome log
        clearInterval(run); // stop the setInterval()

         // dynamically change the run interval
        if(interval>200 ){
          interval = interval*.8;
        }else{
          interval = interval*1.2;
        }

        run = setInterval(request, interval); // start the setInterval()

    }

আমি এই উত্তরটি আরও ভাল পছন্দ করি কারণ এটি আসলে ওপি (এবং আমার) প্রশ্নের উত্তর দেয়। সেটটাইমআউট বিলম্ব হওয়ার সাথে সাথে (100% সিপিইউ ব্যবহার, অন্যান্য স্ক্রিপ্ট ইত্যাদির মাধ্যমে) যেখানে সেটেল ইন্টারভাল হিসাবে সেই বিলম্বগুলি দ্বারা প্রভাবিত হয় না - এটি 'রিয়েলটাইম'
স্টাফের

8
আমি 99% নিশ্চিত যে আপনার সম্পর্কে setInterval@ দ্য রোজএ-র দাবিটি ভুল - এটি এখনও অন্য যে কোনও জাভাস্ক্রিপ্টের মতো একই বিলম্বের বিষয়, এবং প্রায় প্রতিটি ব্রাউজারেও অন্তর্ভুক্তিকে 4 মিমি সেট করে দেয়। এই বা কিছু সম্পর্কে আপনার কোনও পোস্টের লিঙ্ক আছে?
gnarf

9

এটি করা আমার এই উপায়, আমি সেটটাইমআউট ব্যবহার করি:

var timer = {
    running: false,
    iv: 5000,
    timeout: false,
    cb : function(){},
    start : function(cb,iv){
        var elm = this;
        clearInterval(this.timeout);
        this.running = true;
        if(cb) this.cb = cb;
        if(iv) this.iv = iv;
        this.timeout = setTimeout(function(){elm.execute(elm)}, this.iv);
    },
    execute : function(e){
        if(!e.running) return false;
        e.cb();
        e.start();
    },
    stop : function(){
        this.running = false;
    },
    set_interval : function(iv){
        clearInterval(this.timeout);
        this.start(false, iv);
    }
};

ব্যবহার:

timer.start(function(){
    console.debug('go');
}, 2000);

timer.set_interval(500);

timer.stop();

+1 টি, আমি এটা আমার উদ্দেশ্যে সামান্য পরিবর্তিত তাই আমি একাধিক পরিবর্তনশীল অন্তর ব্যবহার করতে পারেন - jsfiddle.net/h70mzvdq
ডালাস

set_intervalনতুন ব্যবধানটি পুরানোটির চেয়ে ছোট না হলে নতুন কার্যকারিতা শুরু না করার জন্যও ফাংশনটি সংশোধন করা হয়েছেif (iv < this.iv) { clearInterval(this.timeout); this.start(false, iv); } else { this.iv = iv; }
ডালাস

9

ifরিফ্রেশ ফাংশনে একটি বিবৃতি থাকা এবং নিয়মিত বিরতিতে আপনার কমান্ড কার্যকর করার জন্য একটি নিয়ন্ত্রণ রাখা অনেক সহজ উপায় । নিম্নলিখিত উদাহরণে, আমি প্রতি 2 সেকেন্ডে একটি সতর্কতা চালাই এবং অন্তর ( intrv) গতিশীলভাবে পরিবর্তন করা যায় ...

var i=1;
var intrv=2; // << control this variable

var refreshId = setInterval(function() {
  if(!(i%intrv)) {
    alert('run!');
  }
  i++;
}, 1000);

এটি আমার ব্যক্তিগত প্রিয়ও। ছোট, সরল, এক্সটেনসিবল।
লোক মোগ্রাবি

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

এটি দুর্দান্ত তবে এটি এমন মুহুর্তগুলিতে অন্তরগুলিকেও জ্বালিয়ে দেয় যা আপনার প্রয়োজন হয় না ... এছাড়াও এটি কিছুটা অপঠনযোগ্য। এই কারণে আমি ব্যক্তিগতভাবে সেটটাইমআউট পছন্দ করতাম।
কোকোডোকো

4

আপনি চান তবে এটি সূচনা করা যেতে পারে। টাইমআউট হ'ল পদ্ধতিটি আমি এটিকে সময়ের শীর্ষে রাখতে ব্যবহার করি used

আমার প্রতি ঘন্টা সময় একটি কোড ব্লক শুরু করার প্রয়োজন ছিল। সুতরাং এটি সার্ভার সূচনাতে শুরু হবে এবং প্রতি ঘন্টা অন্তর অন্তর চালিত হবে। প্রাথমিকভাবে প্রাথমিক রানটি একই মিনিটের মধ্যে অন্তর শুরু করা হয়। সুতরাং init থেকে এক সেকেন্ডে, প্রতি 5 সেকেন্ড পরে তত্ক্ষণাত্তে চালান

var interval = 1000;
var timing =function(){
    var timer = setInterval(function(){
        console.log(interval);
        if(interval == 1000){ /*interval you dont want anymore or increment/decrement */
            interval = 3600000; /* Increment you do want for timer */
            clearInterval(timer);
            timing();
        }
    },interval);
}
timing();

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

var this = function(){
 //do
}
setInterval(function(){
  this()
},3600000)
this()

এখানে আমাদের প্রথমবার চালানো হবে এবং তারপরে প্রতি ঘন্টা।


3

সহজ উত্তর আপনি ইতিমধ্যে তৈরি টাইমার একটি অন্তর আপডেট করতে পারবেন না । (কেবলমাত্র দুটি ফাংশন রয়েছে setInterval/setTimerএবং clearInterval/clearTimerতাই আপনার থাকার কারণে এটি timerIdকেবল নিষ্ক্রিয় করতে পারে)) তবে আপনি কিছু কাজ করতে পারেন। এই গিথুব রেপোটি একবার দেখুন ।


2

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

<body onload="foo()">
<div id="count1">0</div>
<div id="count2">2nd counter is stopped</div>
<button onclick="speed0()">pause</button>
<button onclick="speedx(1)">normal speed</button>
<button onclick="speedx(2)">speed x2</button>
<button onclick="speedx(4)">speed x4</button>
<button onclick="startTimer2()">Start second timer</button>
</body>
<script>
var count1 = 0,
    count2 = 0,
    greenlight = new Boolean(0), //blocks 2nd counter
    speed = 1000,   //1second
    countingSpeed;
function foo(){
    countingSpeed = setInterval(function(){
        counter1();
        counter2();
    },speed);
}
function counter1(){
    count1++;
    document.getElementById("count1").innerHTML=count1;
}
function counter2(){
    if (greenlight != false) {
        count2++;
        document.getElementById("count2").innerHTML=count2;
    }
}
function startTimer2(){
    //while the button hasn't been clicked, greenlight boolean is false
    //thus, the 2nd timer is blocked
    greenlight = true;
    counter2();
    //counter2() is greenlighted
}

//these functions modify the speed of the counters
function speed0(){
    clearInterval(countingSpeed);
}
function speedx(a){
    clearInterval(countingSpeed);
    speed=1000/a;
    foo();
}
</script>

আপনি যদি চান কাউন্টারে বৃদ্ধি একবার পাতা, লোড হয় করা শুরু করতে counter1()এবং counter2()foo()আগে countingSpeedবলা হয়। অন্যথায়, speedকার্যকর করার আগে এটি মিলিসেকেন্ডে লাগে । সম্পাদনা: সংক্ষিপ্ত উত্তর।


2
(function variableInterval() {
    //whatever needs to be done
    interval *= 2; //deal with your interval
    setTimeout(variableInterval, interval);
    //whatever needs to be done
})();

কোন সংক্ষিপ্ত পেতে পারে না


1

আমি জাভাস্ক্রিপ্টে একটি শিক্ষানবিস এবং পূর্ববর্তী উত্তরগুলিতে কোনও সহায়তা পাইনি (তবে অনেক ভাল ধারণা)।
নীচের এই কোডের টুকরাটি ত্বরণ (ত্বরণ> 1) বা হ্রাস করে (ত্বরণ <1)। আমি আশা করি এটি কিছু লোককে সহায়তা করতে পারে:

function accelerate(yourfunction, timer, refresh, acceleration) {
    var new_timer = timer / acceleration;
    var refresh_init = refresh;//save this user defined value
    if (refresh < new_timer ){//avoid reseting the interval before it has produced anything.
        refresh = new_timer + 1 ;
    };
    var lastInter = setInterval(yourfunction, new_timer);
    console.log("timer:", new_timer);
    function stopLastInter() {
        clearInterval(lastInter);
        accelerate(yourfunction, new_timer, refresh_init, acceleration);
        console.log("refresh:", refresh);
    };
    setTimeout(stopLastInter, refresh);
}

সঙ্গে :

  • timer: এমএসে সেট ইন্টারন্টারভাল প্রাথমিক মান (বৃদ্ধি বা হ্রাস)
  • refresh: একটি নতুন মান timerগণনা করার আগে সময় । এই পদক্ষেপ দৈর্ঘ্য
  • factor: পুরানো এবং পরবর্তী timerমানের মধ্যে ব্যবধান । এটি ধাপের উচ্চতা

1

নতুন ফাংশন করুন:

// set Time interval
$("3000,18000").Multitimeout();

jQuery.fn.extend({
    Multitimeout: function () {
        var res = this.selector.split(",");
        $.each(res, function (index, val) { setTimeout(function () { 
            //...Call function
            temp();
        }, val); });
        return true;
    }
});

function temp()
{
    alert();
}

1

একটি হ্রাসকারী / ত্বরান্বিত ব্যবধান টাইমার তৈরি করার আরও একটি উপায় এখানে। মোট সময় অতিক্রম না করা অবধি ব্যবধানটি একটি গুণকের দ্বারা গুণিত হয়।

function setChangingInterval(callback, startInterval, factor, totalTime) {
    let remainingTime = totalTime;
    let interval = startInterval;

    const internalTimer = () => {
        remainingTime -= interval ;
        interval *= factor;
        if (remainingTime >= 0) {
            setTimeout(internalTimer, interval);
            callback();
        }
    };
    internalTimer();
}


0

উপরের অভ্যন্তরীণ কলব্যাক দ্বারা অনুপ্রাণিত হয়ে , আমি কয়েক মিনিটের ভগ্নাংশে কলব্যাক ফায়ার করার জন্য একটি ফাংশন করেছি। টাইমআউট যদি 6 000, 15 000, 30 000, 60 000 এর মত অন্তরগুলিতে সেট করা থাকে তবে এটি আপনার সিস্টেমের ঘড়ির পরবর্তী মুহুর্তে হুবহু সংক্রমণের সাথে সিঙ্কে অন্তরগুলি অবিচ্ছিন্নভাবে অভিযোজিত করবে।

//Interval timer to trigger on even minute intervals
function setIntervalSynced(callback, intervalMs) {

    //Calculate time to next modulus timer event
    var betterInterval = function () {
        var d = new Date();
        var millis = (d.getMinutes() * 60 + d.getSeconds()) * 1000 + d.getMilliseconds();
        return intervalMs - millis % intervalMs;
    };

    //Internal callback
    var internalCallback = function () {
        return function () {
            setTimeout(internalCallback, betterInterval());
            callback();
        }
    }();

    //Initial call to start internal callback
    setTimeout(internalCallback, betterInterval());
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.