জাভাস্ক্রিপ্ট ব্যবহার করে নির্দিষ্ট বিলম্বের পরে স্ক্রিপ্ট কার্যকর করুন


189

JQuery এর মতো কোনও জাভাস্ক্রিপ্ট পদ্ধতি delay()বা wait()(একটি নির্দিষ্ট সময়ের জন্য কোনও স্ক্রিপ্ট কার্যকর করতে বিলম্ব করতে) আছে?

উত্তর:


189

নিম্নলিখিতটি রয়েছে:

setTimeout(function, milliseconds);

ফাংশন যা ফাংশনটি কার্যকর করা হবে তার পরে সময় পার হতে পারে।

দেখুন: উইন্ডো setTimeout()পদ্ধতি


3
এটি এমন কোনও অভিব্যক্তি নয় যা এটি কার্যকর হয় uted @ মারিয়াসের উত্তর এটি চিত্রিত করে।
pedrofurla

117
এটি দেরি নয়, এটি একটি কাঁটাচামচ। বিলম্ব একই থ্রেডে কাজ করা উচিত।
ড্রাগনলর্ড

13
এটি তত্ক্ষণাত ফাংশন_আরফারেন্স কার্যকর করবে। "কাজ" করতে (অবিচ্ছিন্নভাবে) এটি হিসাবে উল্লেখ করা উচিত: সেটটাইমআউট (ফাংশন () {মেথডডোকল ();}, 1000);
বার্নোল্লি IT

6
আমি উল্লেখ করতে চাই যে আমরা জাভাস্ক্রিপ্ট সম্পর্কে কথা বলছি; "থ্রেডগুলি" উপস্থিত করা বা এটি "সিঙ্ক্রোনাসলি" কাজ করা উচিত প্রযুক্তিগতশব্দার্থিকভাবে সত্য হতে পারে তবে জাভাস্ক্রিপ্টের প্রসঙ্গে সত্যই এটি খাপ খায় না, কারণ এই পদ্ধতিগুলির মধ্যে কোনওটির সাথেই বিলম্ব অর্জনের সত্যিই উপায় নেই (আপনি ডন না ' আপনি অন্যান্য ভাষায় যেমন করেন তেমন জেএসে "থ্রেড" তৈরি করবেন না)। এছাড়াও, function_referenceআপনি অন্তর্ভুক্ত না করে এটি অবিলম্বে কার্যকর করা হবে না ()। অর্থাৎ function_referenceঠিক এটি - একটি রেফারেন্স; প্রবেশ function_reference()করলে তাৎক্ষণিকভাবে ফাংশনটি শুরু করা হত।
ড্যানি বুলিস

237

অন্য প্রত্যেকে যা বলেছেন তা কেবল যুক্ত করতে setTimeout: আপনি যদি ভবিষ্যতে কোনও প্যারামিটার দিয়ে কোনও ফাংশন কল করতে চান তবে আপনাকে কিছু বেনামী ফাংশন কল সেট আপ করতে হবে need

আপনার পরে ফাংশনটি কল করার জন্য এটি একটি আর্গুমেন্ট হিসাবে পাস করতে হবে। বাস্তবে এর অর্থ নামের পিছনে বন্ধনী ছাড়াই। নিম্নলিখিতগুলি একবারে সতর্কতাকে কল করবে এবং এটি 'হ্যালো ওয়ার্ল্ড' প্রদর্শন করবে:

var a = "world";
setTimeout(alert("Hello " + a), 2000);

এটি ঠিক করার জন্য আপনি কোনও ফাংশনের নাম রাখতে পারবেন (যেমন ফ্লুব্বা করেছেন) অথবা আপনি কোনও বেনামি ফাংশন ব্যবহার করতে পারেন। আপনার যদি কোনও প্যারামিটারটি পাস করতে হয় তবে আপনাকে একটি বেনামি ফাংশন ব্যবহার করতে হবে।

var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";

তবে আপনি যদি সেই কোডটি চালান তবে লক্ষ্য করবেন যে 2 সেকেন্ড পরে পপআপটি 'হ্যালো স্ট্যাক ওভারফ্লো' বলবে। এটি কারণ ভেরিয়েবল এর মান সেই দুই সেকেন্ডে পরিবর্তিত হয়েছে। দুই সেকেন্ড পরে 'হ্যালো ওয়ার্ল্ড' বলার জন্য, আপনাকে নিম্নলিখিত কোড স্নিপেট ব্যবহার করতে হবে:

function callback(a){
    return function(){
        alert("Hello " + a);
    }
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";

এটি 2 সেকেন্ড অপেক্ষা করবে এবং তারপরে 'হ্যালো ওয়ার্ল্ড' পপআপ করবে।


37

কেবল সামান্য প্রসারিত করার জন্য ... আপনি সরাসরি setTimeoutকলটিতে কোড সম্পাদন করতে পারেন , তবে @ পেট্রিকের বক্তব্য অনুসারে আপনি সাধারণত একটি কলব্যাক ফাংশন বরাদ্দ করেন। সময়টি মিলি সেকেন্ডের

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}

27

আপনি যদি সত্যিই কোনও ব্লকিং (সিঙ্ক্রোনাস) delayফাংশন (যা কিছু জন্য) রাখতে চান তবে কেন এমন কিছু করবেন না:

<script type="text/javascript">
    function delay(ms) {
        var cur_d = new Date();
        var cur_ticks = cur_d.getTime();
        var ms_passed = 0;
        while(ms_passed < ms) {
            var d = new Date();  // Possible memory leak?
            var ticks = d.getTime();
            ms_passed = ticks - cur_ticks;
            // d = null;  // Prevent memory leak?
        }
    }

    alert("2 sec delay")
    delay(2000);
    alert("done ... 500 ms delay")
    delay(500);
    alert("done");
</script>

2
এই সমাধানটির সাথে অসুবিধাটি হ'ল এটি সক্রিয়ভাবে একটি প্রসেসর ব্যবহার করে, যা বিদ্যুতের ব্যবহার বৃদ্ধি এবং অন্যান্য থ্রেড / প্রক্রিয়াগুলির জন্য উপলব্ধ সংস্থানগুলিতে হ্রাস বাড়ে (যেমন অন্যান্য ট্যাব, অন্যান্য প্রোগ্রাম)। বিপরীতে, ঘুম সাময়িকভাবে সিস্টেম সংস্থানগুলির একটি থ্রেডের ব্যবহার স্থগিত করে।
র‌্যামডডুগাল

1
নতুন তারিখের পরিবর্তে ডেট.নো () ব্যবহার করা ভাল () এবং মেমরি ফাঁস সম্পর্কে চিন্তা করবেন না
ওয়েফিয়ার

1
অবশ্যই এটি সিপিইউ নিবিড়, তবে দ্রুত এবং নোংরা পরীক্ষার জন্য এটি কাজ করে
মারিস বি।

আমি এর এমন একটি সংস্করণ চাই যা থ্রেডটিকে লক করে না, তাই আমি delayইনগ করার আগে ডমকে রিফ্রেশ করতে পারি ( এই প্রশ্নের উত্তর দেওয়ার জন্য )। এটি করার কোনও উপায় আছে?
গুই ইমামুরা

3
আরও কমপ্যাক্ট রুটিন: ফাংশন বিলম্ব (এমএস) start var start_time = তারিখ.নো (); যখন (তারিখ.নো () - শুরু_কালীন <এমএস); }
ডিউক

15

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


2
তবুও এটি পরীক্ষার উদ্দেশ্যে কার্যকর হবে। নতুন এইচটিটিপি অনুরোধ করার আগে পৃষ্ঠার পরিবর্তনগুলি মূল্যায়নের জন্য কয়েক সেকেন্ডের জন্য ফর্ম জমা দেওয়ার ক্ষেত্রে বিলম্ব করা।
রাশিংজ

1
@Rushinge তারপরে ফর্মটি জমা দেওয়ার জন্য কলব্যাক সেট করুন এবং ডিফল্ট ফর্ম জমাটি অক্ষম করুন
পপুলাস

1
কোড হিসাবে একটি লিঙ্ক রেখে যাওয়ার খারাপ ধারণা ... এখনকার মতো এটি কাজ করে না।
এমমেট

1
বা আপনি জানেন, আমি ঠিক এটি ঠিক করতে পারে।
প্যাট্রিক

14

নিয়মিত বিরতিতে কিছু কোড বারবার চালানোর জন্য আপনি উইন্ডো.সেটইন্টারওয়াল () ব্যবহার করতে পারেন ।


2
সেটইন্টারওয়াল () এর পরিবর্তে সেটটাইমআউট ব্যবহার করা উচিত নয়
পল

9
setTimeout()এটি একবার করে, setInterval()বারবার করে। আপনি যদি চান যে আপনার কোডটি প্রতি 5 সেকেন্ডে চালানো setInterval()হয় তবে তা কাজের জন্য তৈরি।
rcoup

11

পূর্ববর্তী মন্তব্যগুলি যুক্ত করতে, আমি নিম্নলিখিতটি বলতে চাই:

setTimeout()জাভাস্ক্রিপ্ট ফাংশন SE স্ক্রিপ্ট প্রতি সঞ্চালনের বিরাম না, কিন্তু নিছক কম্পাইলার ভবিষ্যতে কোড একদা চালানো বলে।

এমন কোনও ফাংশন নেই যা জাভাস্ক্রিপ্টে অন্তর্নিহিত মৃত্যুদন্ড কার্যকর করতে পারে। তবে, আপনি আপনার নিজের ফাংশনটি লিখতে পারেন যা Date()ফাংশনটি ব্যবহার করে এবং আপনার প্রয়োজনীয় সময়ের ব্যবধানটি যোগ করে সময় না আসা পর্যন্ত শর্তহীন লুপের মতো কিছু করে does


11

আপনার যদি কেবলমাত্র বিলম্ব পরীক্ষা করতে হয় তবে আপনি এটি ব্যবহার করতে পারেন:

function delay(ms) {
   ms += new Date().getTime();
   while (new Date() < ms){}
}

এবং তারপরে আপনি যদি 2 সেকেন্ডের জন্য বিলম্ব করতে চান তবে আপনি যা করুন:

delay(2000);

যদিও উত্পাদনের জন্য সেরা নাও হতে পারে। মন্তব্যগুলিতে এটি সম্পর্কে আরও


@ U2744 SNOWFLAKE আপনি নিজের মন্তব্যে কিছুটা সুনির্দিষ্ট করে দেখতে চেষ্টা করতে পারেন
ক্রিস্টোফার

1
ঠিক আছে, এটি একটি ব্যস্ত লুপ যা ল্যাপটপ এবং অন্যান্য মোবাইল ডিভাইসের ব্যাটারিগুলি নিষ্কাশিত করবে এবং সম্ভবত ইউআইকে প্রতিক্রিয়া দেওয়া (বা এমনকি প্রদর্শনের) থেকেও আটকাবে।
রাই-

@ U2744NOWFLAKE অর্থবোধ করে। আমি এই ফাংশনটি
ক্রিস্টোফার

2
দ্রুত এবং নোংরা (এবং অস্থায়ী) সমাধানের জন্য বিকাশে যথেষ্ট ভাল কাজ করে।
হিউম্যানআইডিজুইজ

5

কেন আপনি একটি প্রতিশ্রুতি পিছনে কোড রাখতে পারবেন না? (আমার মাথার উপরের অংশে টাইপ করা)

new Promise(function(resolve, reject) {
  setTimeout(resolve, 2000);
}).then(function() {
  console.log('do whatever you wanted to hold off on');
});


5

সহজ উত্তরটি হ'ল:

setTimeout(
    function () {
        x = 1;
    }, 1000);

উপরের ফাংশনটি 1 সেকেন্ডের জন্য অপেক্ষা করে (1000 এমএস) তারপরে x থেকে 1 সেট করে Ob স্পষ্টতই এটি একটি উদাহরণ; বেনামে ফাংশনটির ভিতরে আপনি যে কোনও কিছু করতে চান।


4

কল করার তিনটি ভিন্ন পদ্ধতির সাথে আমি সত্যিই মরিয়াসের ব্যাখ্যা (সর্বাধিক উন্নত প্রতিক্রিয়া) পছন্দ করেছি setTimeout

আমার কোডে আমি একটি এজেএক্স সেভ ইভেন্ট শেষ হওয়ার পরে পূর্ববর্তী পৃষ্ঠায় স্বয়ংক্রিয়ভাবে নেভিগেট করতে চাই। সেভ ইভেন্টটি সম্পূর্ণ হওয়ার সিএসএসে একটি সামান্য অ্যানিমেশন রয়েছে যা ইঙ্গিত করে সেভ সফল হয়েছিল।

আমার কোডে আমি প্রথম দুটি উদাহরণের মধ্যে একটি পার্থক্য পেয়েছি:

setTimeout(window.history.back(), 3000);

এইটি সময়সীমার জন্য অপেক্ষা করে না - পিছনে () প্রায় দেরি করে ডাকা হয় যাই হোক না কেন আমি বিলম্বের জন্য কোন নম্বর রেখেছি।

তবে এটি এটিকে পরিবর্তন করে:

setTimeout(function() {window.history.back()}, 3000);

আমি যা আশা করছিলাম এটি ঠিক তাই করে।

এটি ব্যাক () অপারেশনের সাথে সুনির্দিষ্ট নয়, একই সাথে ঘটে alert()। মূলত alert()প্রথম ক্ষেত্রে ব্যবহৃত সঙ্গে , বিলম্ব সময় উপেক্ষা করা হয়। আমি যখন পপআপ বরখাস্ত করি তখন CSS এর জন্য অ্যানিমেশনটি অবিরত থাকে।

সুতরাং, আমি দ্বিতীয় বা তৃতীয় পদ্ধতির সুপারিশ করব যা তিনি বর্ণনা করেছেন এমনকি আপনি যদি অন্তর্নির্মিত ফাংশনগুলি ব্যবহার না করে ব্যবহার করছেন are


1

আমার কিছু এজাক্স কমান্ড ছিল যার মধ্যে আমি বিলম্ব করে দৌড়াতে চাই। এটি করার এক উপায়ের একটি সাধারণ উদাহরণ এখানে। আমি আমার প্রচলিত পদ্ধতির জন্য যদিও টুকরো টুকরো করা হতে প্রস্তুত। :)

//  Show current seconds and milliseconds
//  (I know there are other ways, I was aiming for minimal code
//  and fixed width.)
function secs()
{
    var s = Date.now() + ""; s = s.substr(s.length - 5);
  return s.substr(0, 2) + "." + s.substr(2);
}

//  Log we're loading
console.log("Loading: " + secs());

//  Create a list of commands to execute
var cmds = 
[
    function() { console.log("A: " + secs()); },
    function() { console.log("B: " + secs()); },
    function() { console.log("C: " + secs()); },
    function() { console.log("D: " + secs()); },
    function() { console.log("E: " + secs()); },
  function() { console.log("done: " + secs()); }
];

//  Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
    setTimeout(cmd, ms * i);
});

// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());

আপনি কোড ব্লকটি অনুলিপি করে এটি কনসোল উইন্ডোতে পেস্ট করতে পারেন এবং এর মতো দেখতে পারেন:

Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076

1

বিলম্ব সহ আপনার ফাংশনটি কল করার সহজ সমাধানটি হ'ল:

function executeWithDelay(anotherFunction) {
    setTimeout(anotherFunction, delayInMilliseconds);
}

0

বিলম্ব কার্য:

/**
 * delay or pause for some time
 * @param {number} t - time (ms)
 * @return {Promise<*>}
 */
const delay = async t => new Promise(resolve => setTimeout(resolve, t));

asyncফাংশন ভিতরে ব্যবহার :

await delay(1000);

-1

অন্যরা যেমন বলেছে, সেটটাইমআউটটি আপনার নিরাপদ বাজি
তবে কখনও কখনও আপনি যুক্তিকে একটি নতুন ফাংশনে আলাদা করতে পারবেন না তবে আপনি ডিলিট.নু () ব্যবহার করতে পারেন মিলিসেকেন্ডগুলি পেতে এবং নিজেই বিলম্ব করতে পারেন ....

function delay(milisecondDelay) {
   milisecondDelay += Date.now();
   while(Date.now() < milisecondDelay){}
}

alert('Ill be back in 5 sec after you click OK....');
delay(5000);
alert('# Im back # date:' +new Date());

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