প্রথম বার দেরি না করে সেটইন্টারভাল ফাংশনটি সম্পাদন করুন


341

setIntervalজাভাস্ক্রিপ্টের পদ্ধতিটি তত্ক্ষণাত কার্যকর করার জন্য কনফিগার করার উপায় রয়েছে এবং তারপরে টাইমার দিয়ে কার্যকর করা যায়


4
নেটিভ যদিও না। আপনি functionএকবার কল করার চেষ্টা করতে পারেন এবং তারপরেsetInterval()
মিস্টারফিফ

উত্তর:


519

কেবলমাত্র প্রথমবার নিজেকে সরাসরি ফাংশনটি কল করা সবচেয়ে সহজ:

foo();
setInterval(foo, delay);

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

সুতরাং বিকল্প বিকল্পটি এর পরিবর্তে fooপরবর্তী কলগুলির জন্য নিজেকে ট্রিগার setTimeoutকরা:

function foo() {
   // do stuff
   // ...

   // and schedule a repeat
   setTimeout(foo, delay);
}

// start the cycle
foo();

এটি গ্যারান্টি দেয় যে কলগুলির মধ্যে অন্তত অন্তর অন্তর রয়েছে delay। প্রয়োজনে লুপটি বাতিল করাও সহজ করে তোলে - setTimeoutআপনার লুপ সমাপ্তির শর্তটি পৌঁছে গেলে আপনি কেবল কল করবেন না ।

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

(function foo() {
    ...
    setTimeout(foo, delay);
})();

যা ফাংশনটি সংজ্ঞায়িত করে এবং একসাথে চক্রটি শুরু করে।


5
আপনি কেন পছন্দ করেন setTimeout?
সংঘুন লী

19
@ সাংডল কারণ এটি নিশ্চিত করে যে টাইমার ইভেন্টগুলি যদি কোনও প্রক্রিয়াবিহীনভাবে ছেড়ে যায় তবে "স্ট্যাক" না করে। কিছু পরিস্থিতিতে পুরো setIntervalঘটনা পুরোদমে কোনও বিলম্ব ছাড়াই একে অপরের সাথে সাথে আসতে পারে।
আলনিটাক

8
এমন এক ধরণের পরীক্ষা থাকতে হবে যা ক্লান্ত হয়ে পড়লে আপনাকে স্ট্যাকের উপরে পোস্ট করতে দেয় না
জেমস

3
আমি যদি setTimeoutপদ্ধতিটি ব্যবহার করি তবে কীভাবে আমি ফাংশনটি বন্ধ করব ?
গৌরভ ভোর

6
@ ডেভমুঙ্গার না, কারণ এটি সত্যিকার অর্থে পুনরাবৃত্তি নয় - এটি কেবল "সিউডো-রিকার্সিভ"। "পুনরাবৃত্ত" কলগুলি ঘটবে না যতক্ষণ না ব্রাউজার ইভেন্ট লুপটিতে ফিরে আসে, সেই সময়ে কল স্ট্যাক সম্পূর্ণ অযাচিত হয়ে যায়।
Alnitak

210

আমি আপনাকে সঠিকভাবে বুঝতে পারছি কিনা তা নিশ্চিত নই তবে আপনি সহজেই এরকম কিছু করতে পারেন:

setInterval(function hello() {
  console.log('world');
  return hello;
}(), 5000);

এটি করার কোনও উপায় স্পষ্টতই রয়েছে তবে এটি আমি সবচেয়ে সংক্ষিপ্তভাবে ভাবতে পারি।


16
এটি একটি দুর্দান্ত উত্তর কারণ এটি একটি নামযুক্ত ফাংশন যা অবিলম্বে সম্পাদন করে এবং নিজেই ফিরে আসে। ঠিক আমি খুঁজছেন ছিল কি.
jmort253

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

4
আপনার এটির নাম 'হ্যালো' দেওয়ার দরকার নেই। পরিবর্তে আপনি একটি বেনামী ফাংশন arguments.callee আসতে পারে এবং একই
JochenJung

10
@ জোচেনজং arguments.calleeES5 কঠোর মোডে উপলব্ধ নয়
Alnitak

3
এটি জাভাস্ক্রিপ্ট কোডের মতোই যা অন্যান্য ভাষা থেকে আসা বেশিরভাগ নতুন জেএস প্রোগ্রামারকে বিভ্রান্ত করবে। আপনার সংস্থায় প্রচুর জেএস কর্মী না থাকলে এবং আপনি যদি চাকরীর সুরক্ষা চান তবে এগুলি একগুচ্ছ জিনিস লিখুন।
আয়ান

13

একই সমস্যার কারণে আমি এই প্রশ্নটিতে হোঁচট খেয়েছি তবে উত্তরগুলির কোনওটিই আপনাকে সাহায্য করতে পারে না ঠিক যেমন আচরণ করতে হবে setInterval()তবে কেবলমাত্র পার্থক্যটির সাথে সাথে শুরুতে ফাংশনটি বলা হয়েছিল is

এই সমস্যার সমাধানটি এখানে দেওয়া হল:

function setIntervalImmediately(func, interval) {
  func();
  return setInterval(func, interval);
}

এই সমাধানের সুবিধা:

  • বিদ্যমান কোড ব্যবহার করে setIntervalসহজেই প্রতিস্থাপনের সাথে মানিয়ে নেওয়া যায়
  • কড়া মোডে কাজ করে
  • এটি বিদ্যমান নামযুক্ত ফাংশন এবং ক্লোজারগুলির সাথে কাজ করে
  • আপনি এখনও রিটার্ন মানটি ব্যবহার করতে এবং clearInterval()পরে এটি পাস করতে পারেন

উদাহরণ:

// create 1 second interval with immediate execution
var myInterval = setIntervalImmediately( _ => {
        console.log('hello');
    }, 1000);

// clear interval after 4.5 seconds
setTimeout( _ => {
        clearInterval(myInterval);
    }, 4500);

কৌতুকপূর্ণ হওয়ার জন্য, আপনার যদি সত্যিই ব্যবহারের প্রয়োজন হয় setIntervalতবে আপনি মূলটি প্রতিস্থাপন করতে পারেন setInterval। সুতরাং, আপনার বিদ্যমান কোডের আগে এটি যুক্ত করার সময় কোডের কোনও পরিবর্তন করার প্রয়োজন নেই:

var setIntervalOrig = setInterval;

setInterval = function(func, interval) {
    func();
    return setIntervalOrig(func, interval);
}

তবুও, উপরে তালিকাভুক্ত সমস্ত সুবিধাগুলি এখানে প্রয়োগ হয় তবে কোনও বিকল্পের প্রয়োজন হয় না।


আমি সমাধানটির চেয়ে এই সমাধানটিকে পছন্দ করি setTimeoutকারণ এটি কোনও setIntervalবস্তু ফেরত দেয় । পরে কোডে থাকা এবং বর্তমান সময়ে সংজ্ঞায়িত ফাংশনগুলি এড়াতে, আমি প্রথম ফাংশন কলটি এই জাতীয় ফাংশনটিতে গুটিয়ে রাখি setTimeout: setTimeout(function(){ func();},0);প্রথম ফাংশনটি তারপরে বর্তমান প্রসেসিং চক্রের পরে ডাকা হয়, যা তাত্ক্ষণিকভাবে হয় তবে এটি হয় আরও ত্রুটি প্রমাণিত।
পেনসান

8

আপনি এমন setInterval()কোনও ক্রিয়াকলাপে গুটিয়ে রাখতে পারেন যা আচরণটি সরবরাহ করে:

function instantGratification( fn, delay ) {
    fn();
    setInterval( fn, delay );
}

... তারপরে এটি ব্যবহার করুন:

instantGratification( function() {
    console.log( 'invoked' );
}, 3000);

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

5

এটির প্রয়োজন হলে এটি সুন্দর করার জন্য একটি র‍্যাপার এখানে রয়েছে:

(function() {
    var originalSetInterval = window.setInterval;

    window.setInterval = function(fn, delay, runImmediately) {
        if(runImmediately) fn();
        return originalSetInterval(fn, delay);
    };
})();

সেটইন্টারভালটির তৃতীয় যুক্তিটি সত্যে সেট করুন এবং সেটইন্টারভাল কল করার পরে এটি প্রথমবারের জন্য চালানো হবে:

setInterval(function() { console.log("hello world"); }, 5000, true);

বা তৃতীয় যুক্তি বাদ দিন এবং এটি এর আসল আচরণটি ধরে রাখবে:

setInterval(function() { console.log("hello world"); }, 5000);

কিছু ব্রাউজার সেট- ইন্টেরওয়ালের জন্য অতিরিক্ত যুক্তি সমর্থন করে যা এই মোড়কটিকে বিবেচনায় নেই; আমি মনে করি এগুলি খুব কমই ব্যবহৃত হয়, তবে আপনার যদি তাদের প্রয়োজন হয় তবে তা মনে রাখবেন।


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

2

কারও পক্ষে বাইরের thisভিতরে আনতে হবে যেন এটি একটি তীরের ফাংশন।

(function f() {
    this.emit("...");
    setTimeout(f.bind(this), 1000);
}).bind(this)();

যদি উপরের উত্পাদনকারী আবর্জনা আপনাকে বিরক্ত করে তোলে তবে আপনি পরিবর্তে এটি বন্ধ করতে পারেন।

(that => {
    (function f() {
        that.emit("...");
        setTimeout(f, 1000);
    })();
})(this);

অথবা আপনার কোডের উপর নির্ভর করে ডেকরেটার ব্যবহার করার বিষয়টি@autobind বিবেচনা করুন।


1

আমি নিম্নলিখিত ক্রমানুসারে ফাংশনগুলি কল করার পরামর্শ দেব

var _timer = setInterval(foo, delay, params);
foo(params)

আপনি কোনও নির্দিষ্ট শর্তে _timerচাইলে আপনি foo এও দিতে পারেনclearInterval(_timer)

var _timer = setInterval(function() { foo(_timer, params) }, delay);
foo(_timer, params);

আপনি আরও গভীরতা এ ব্যাখ্যা করতে পারেন?
Polyducks

আপনি দ্বিতীয় কল থেকে টাইমার সেট করেছেন, প্রথমবারের জন্য আপনি সরাসরি fn কে সরাসরি কল করবেন।
জয়ন্ত ভার্শনে

1

চারপাশে সমস্ত গোলমাল না করেই novices এর জন্য একটি সাধারণ সংস্করণ। এটি কেবল ফাংশনটি ঘোষণা করে, কল করে, তারপরে বিরতি শুরু করে। এটাই.

//Declare your function here
function My_Function(){
  console.log("foo");
}    

//Call the function first
My_Function();

//Set the interval
var interval = window.setInterval( My_Function, 500 );


1
গ্রহণযোগ্য উত্তরটি প্রথম কয়েকটি লাইনে ঠিক তাই করে। এই উত্তরটি কীভাবে নতুন কিছু যুক্ত করে?
ড্যান ড্যাসকলেসকু

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

0

এই সমস্যাটি সমাধান করার জন্য, পৃষ্ঠাটি লোড হওয়ার পরে আমি প্রথমবার ফাংশনটি চালাচ্ছি।

function foo(){ ... }

window.onload = function() {
   foo();
};

window.setInterval(function()
{
    foo(); 
}, 5000);

0

ফার্স্ট ইন্টারভাল নামে একটি সুবিধাজনক এনপিএম প্যাকেজ রয়েছে (সম্পূর্ণ প্রকাশ, এটি আমার)।

এখানকার অনেক উদাহরণের মধ্যে প্যারামিটার হ্যান্ডলিং অন্তর্ভুক্ত নয় এবং setIntervalকোনও বড় প্রকল্পে ডিফল্ট আচরণ পরিবর্তন করা খারাপ। দস্তাবেজগুলি থেকে:

এই প্যাটার্ন

setInterval(callback, 1000, p1, p2);
callback(p1, p2);

অনুরূপ

firstInterval(callback, 1000, p1, p2);

আপনি যদি ব্রাউজারে পুরানো স্কুল হন এবং নির্ভরতা না চান তবে কোড থেকে এটি সহজেই কাট-পেস্ট করা যায়।


0

// YCombinator
function anonymous(fnc) {
  return function() {
    fnc.apply(fnc, arguments);
    return fnc;
  }
}

// Invoking the first time:
setInterval(anonymous(function() {
  console.log("bar");
})(), 4000);

// Not invoking the first time:
setInterval(anonymous(function() {
  console.log("foo");
}), 4000);
// Or simple:
setInterval(function() {
  console.log("baz");
}, 4000);

ঠিক আছে এটি এত জটিল, সুতরাং আমি এটি আরও সহজ করে বলি:

function hello(status ) {    
  console.log('world', ++status.count);
  
  return status;
}

setInterval(hello, 5 * 1000, hello({ count: 0 }));


এটি প্রকৃতপক্ষে ইঞ্জিনিয়ারড।
Polyducks

0

আপনি খুব ছোট প্রাথমিক বিলম্ব-সময় (উদাহরণস্বরূপ 100) সেট করতে পারেন এবং এটি ফাংশনটির মধ্যে আপনার পছন্দসই বিলম্ব-সময়কে সেট করতে পারেন:

var delay = 100;

function foo() {
  console.log("Change initial delay-time to what you want.");
  delay = 12000;
  setTimeout(foo, delay);
}


-2

আপনার ফাংশনটির তাত্ক্ষণিক অ্যাসিনক্রোনাস কল নিয়ে একটি সমস্যা আছে কারণ স্ট্যান্ডার্ড সেটটাইমআউট / সেটইন্টারভাল বেশ কয়েকটি মিলিসেকেন্ড সম্পর্কে নূন্যতম টাইমআউট রয়েছে এমনকি আপনি এটি সরাসরি 0 এ সেট করে থাকলেও এটি ব্রাউজারের নির্দিষ্ট কাজের কারণে ঘটে।

রিয়েল শূন্যের বিলম্ব সহ কোডের একটি উদাহরণ যা ক্রোম, সাফারি, অপেরাতে কাজ করে

function setZeroTimeout(callback) {
var channel = new MessageChannel();
channel.port1.onmessage = callback;
channel.port2.postMessage('');
}

আপনি এখানে আরও তথ্য পেতে পারেন

এবং প্রথম ম্যানুয়াল কলয়ের পরে আপনি আপনার ফাংশনটির সাথে একটি বিরতি তৈরি করতে পারেন।


-10

আসলে দ্রুততম কাজ করা হয়

interval = setInterval(myFunction(),45000)

এটি মাইফাঙ্কশনটি কল করবে এবং তারপরে এটি প্রতি 45 সেকেন্ডে আগায়িয়ান করবে যা করা থেকে আলাদা

interval = setInterval(myfunction, 45000)

যা এটিকে কল করবে না, তবে কেবল সময় নির্ধারণ করবে


আপনি কোথা থেকে পেতে পারেন?
কেন শার্প

2
এটি কেবল তখনই কাজ myFunction()করে যদি return পরিবর্তে প্রতিটি ফাংশন setIntervalএটির দ্বারা পরিবর্তিত করা setIntervalঅন্যান্য উত্তর প্রস্তাব দেওয়ার মতো একবার মোড়ানোর জন্য আরও ভাল পদ্ধতির ।
জেনস ওয়ার্থ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.