আমি কীভাবে একটি সেটটাইমআউট () কলব্যাকে একটি পরামিতি পাস করতে পারি?


825

আমার কাছে কিছু জাভাস্ক্রিপ্ট কোড রয়েছে যা দেখে মনে হচ্ছে:

function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    var topicId = xmlhttp.responseText;
    setTimeout("postinsql(topicId)",4000);
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

আমি একটি ত্রুটি পেয়েছি যা topicIdসংজ্ঞায়িত নয় আমি setTimeout()ফাংশনটি ব্যবহার করার আগে সবকিছুই কাজ করে যাচ্ছিল ।

আমি চাই আমার postinsql(topicId)ফাংশনটি কিছু সময়ের পরে ডাকা হবে। আমার কি করা উচিৎ?


75
এটি যেমন একটি পুরানো বিষয়ে মন্তব্য করতে কিছুটা ব্যথা করে তবে আমি কেবল একটি তৃতীয় সংস্করণ (যা আমার মতে অনেকটা ক্লিনার) অফার করতে হবে: সেটটাইমআউট (postinsql.bind (নাল, টপিকআইডি), 4000)
হাবলিন

14
@ হাবলিন: রেকর্ডটি সোজা করতে কেন ক্ষতি হবে? এই জনপ্রিয় প্রশ্নটিতে পৌঁছানোর এবং পুরানো, বিতর্কিত কল স্টাইলটি দেখে কি অন্যদের ক্ষতি করবে না?
ড্যান ড্যাসকলেসকু

2
এখানে সমস্ত পরিষ্কার: w3schools.com/jsref/met_win_settimeout.asp
ভ্লাদিস্লাভ

@dbliss আমার পরামর্শটি ইতিমধ্যে বেশ কয়েকটি উত্তরে উল্লেখ করা হয়েছে এবং উত্তর হিসাবে এখানে যুক্ত করা হয়েছে: stackoverflow.com/a/15620038/287130 তবে আমি খুশি যে আমার পরামর্শটি প্রশংসিত হয়েছে;)
হাবলিন

@ হাবলিন আহ, এটি উল্লেখ করার জন্য অনেক ধন্যবাদ। আমি আপনার পোস্ট করা উত্তর খুঁজতে গিয়ে স্ক্রোল করেছিলাম এবং এটি মিস করেছি।
dbliss

উত্তর:


1122
setTimeout(function() {
    postinsql(topicId);
}, 4000)

আপনার স্ট্রিংয়ের পরিবর্তে একটি বেনামি ফাংশনটি খাওয়াতে হবে, পরবর্তী পদ্ধতিটি ECMAScript স্পেসিফিকেশন অনুযায়ীও কাজ করা উচিত নয় তবে ব্রাউজারগুলি কেবল বিন্যাসযোগ্য। এটি যথাযথ সমাধান, ব্যবহার করার সময় কখনও কোনও স্ট্রিংকে 'ফাংশন' হিসাবে পাস করার উপর নির্ভর করবেন না setTimeout()বা setInterval()এটি ধীর গতির কারণ এটি মূল্যায়ন করতে হবে এবং এটি ঠিক সঠিক নয়।

হালনাগাদ:

প্রশ্নটিতে হবব্লিন তাঁর মন্তব্যে যেমন বলেছেন , এখন আপনি সেটটাইমআউট ব্যবহার করে ফাংশনটিতে যুক্তিগুলি পাস করতে পারেন Function.prototype.bind()

উদাহরণ:

setTimeout(postinsql.bind(null, topicId), 4000);

30
window.setTimeoutএকটি ডিওএম পদ্ধতি, এবং এটি ইসমাস্ক্রিপ্ট স্পেসিফিকেশন দ্বারা সংজ্ঞায়িত হয় না। স্ট্রিং পাস করা সর্বদা ব্রাউজারগুলিতে কাজ করে, এবং এটি একটি ডি স্ট্যাক্ট স্ট্যান্ডার্ড - আসলে জাভাস্ক্রিপ্ট ১.২ সহ ফাংশন অবজেক্টটি পাস করার ক্ষমতা যুক্ত করা হয়েছিল - এটি স্পষ্টভাবে এইচটিএমএল 5 খসড়া অংশের অংশ ( whatswg.org/specs/web) -অ্যাপস / বর্তমান-কাজ / মাল্টিপেজ /… )। তবে, কোনও ফাংশন অবজেক্টের পরিবর্তে স্ট্রিং ব্যবহার করা সাধারণত দুর্বল শৈলী হিসাবে বিবেচিত হয় কারণ এটি মূলত বিলম্বের একটি রূপ eval()
মাইল

2
var temp = setTimeout (ফাংশন () {postinsql (টপিকআইডি);}, 4000); clearTimeout (টেম্প); ??
জোশ ম্যাক

12
টাইমআউট টাইমআউট সেট হওয়ার পরে পরিবর্তিত হয়ে গেলে, তবে ফাংশনটি বলার আগে কী হবে?
pilau

22
@ পিলাউ এটি হ'ল আমার সমস্যা: যদি বেনামে ফাংশনে ব্যবহৃত ভেরিয়েবলগুলি সময়সীমা পূর্বে পরিবর্তিত হয় (যেমন লুপের জন্য) তবে এটিও ফাংশনের অভ্যন্তরে পরিবর্তিত হবে। সুতরাং আমার উদাহরণে লুপের জন্য 5 টি আলাদা টাইমআউটগুলি সেট করা আসলে একই ভেরিয়েবলগুলি ব্যবহার করে শেষ হয়েছিল। এই উত্তরটি ব্যবহার করার সময় সাবধান!
ক্রিশ্চিয়ান

10
@ পাইলাউ আরেকটি বন্ধ ব্যবহার করে টপিকআইডিতে সহায়তা করবে = 12; ফাংশন postinsql (টপিকআইড) {কনসোল.লগ (টপিকআইডি); } ফাংশন সেটটাইমআউটওয়াইথক্লোজার (টপিকআইড) {সেটটাইমআউট (ফাংশন () {পোস্টিনসকিএল (টপিকআইডি);}, 1000)} সেটটাইমআউটফানশন (টপিকআইডি); topicId = 13;
হালিস ইলবোয়া

727

আধুনিক ব্রাউজারগুলিতে, "সেটটাইমআউট" তৃতীয় প্যারামিটার পায় যা টাইমার শেষে অভ্যন্তরীণ ফাংশনে প্যারামিটার হিসাবে প্রেরণ করা হয়।

উদাহরণ:

var hello = "Hello World";
setTimeout(alert, 1000, hello);

আরো বিস্তারিত:


56
আমি নিশ্চিত নই কেন এই উত্তরটি সেরা হিসাবে নির্বাচিত হয়নি। একটি বেনামি ফাংশন ব্যবহার করে অবশ্যই কাজ করে, তবে আপনি যদি মূল সেটটাইমআউট ফাংশন কলটিতে তৃতীয় প্যারামিটারটি সহজেই পাস করতে পারেন ... তবে কেন নয়?
ক্রিস শ্যউ

54
কারণ এটি বুনোতে এখনও IE এর সংস্করণগুলিতে কাজ করে না।
অ্যারন

4
এই উত্তরটি আমাকে আসলে একটি ইভেন্ট অবজেক্টটি পাস করতে সক্ষম করেছিল, অন্যান্য পদ্ধতিগুলি তা করেনি। আমি ইতিমধ্যে একটি বেনাম ফাংশন ছিল।
গ্লেন প্লাস

27
আরও ভাল উত্তর দ্বারা। যদি আপনার এমন কোড থাকে যা "সেটটাইমআউট" কল এবং বেনাম ফাংশনের আসল সম্পাদনের মধ্যে আপনার প্যারামিটারটি পরিবর্তন করে - অজ্ঞাতনামা ফাংশনটি পরিবর্তিত মান গ্রহণ করবে, সেটটাইমআউট কলের সময় যা ছিল তা নয়। উদাহরণস্বরূপ: (var i = 0; i <100; i ++) {সেটটাইমআউট (ফাংশন () {কনসোল.উইট (i);}, 0); } এটি "100" একটি 100 বার লগ হবে (এফএফ পরীক্ষিত)। বর্তমান উত্তর এটি এড়াতে সহায়তা করে।
মূল

1
বিকাশকারী.মোজিলা.আর . / এস / ডকস / ওয়েবে / এপিআই / উইন্ডো টাইমারস / সেটটির সাথে সঙ্গতিপূর্ণ ইন্টারনেট এক্সপ্লোরারের জন্য কলব্যাক আর্গুমেন্টগুলি কেবল সংস্করণ> = 10 এ সমর্থিত, অনেক সাইট যেমন আই 8 এবং আই 9 এখনও কিছু প্রাসঙ্গিক ভাগ পায় তেমন যত্নবান।
le0diaz

153

কিছু গবেষণা এবং পরীক্ষা করার পরে, একমাত্র সঠিক বাস্তবায়ন হ'ল:

setTimeout(yourFunctionReference, 4000, param1, param2, paramN);

সেটটাইমআউট আপনার অতিরিক্ত সমস্ত পরামিতিগুলি আপনার ফাংশনে পাস করবে যাতে সেগুলি সেখানে প্রক্রিয়া করা যায়।

বেনামে ফাংশনটি খুব বেসিক স্টাফের জন্য কাজ করতে পারে তবে কোনও বস্তুর উদাহরণের মধ্যে যেখানে আপনাকে "এটি" ব্যবহার করতে হবে, এটি কাজ করার কোনও উপায় নেই। কোনও বেনামি ফাংশন উইন্ডোতে নির্দেশ করতে "এটি" পরিবর্তন করবে, সুতরাং আপনি আপনার অবজেক্টের উল্লেখটি হারাবেন।


24
এটা আমার হৃদয়ে দুঃখের সাথে অবশ্যই জানিয়ে দিতে হবে: এটি ইন্টারনেট এক্সপ্লোরার হিসাবে কাজ করে না। : / সমস্ত অতিরিক্ত প্যারামগুলি অপরিজ্ঞাত হিসাবে আসে।
অমলগোভিনাস

6
আমি কেবল ব্যবহার করিvar that = this; setTimeout( function() { that.foo(); }, 1000);
এড উইলিয়ামস

2
এটি সঠিক, এবং এটি HTML5 তে নির্দিষ্ট করা আছে specified হোয়াটএইচআর.জি.
গ্যারেট

4
এটি ঠিক ফ্যাবিওর মতো একই উত্তর ।
ড্যান ড্যাসকলেসকু

1
বিকাশকারী.মোজিলা.আর . / এস / ডকস / ওয়েবে / এপিআই / উইন্ডো টাইমারস / সেটটির সাথে সঙ্গতিপূর্ণ ইন্টারনেট এক্সপ্লোরারের জন্য কলব্যাক আর্গুমেন্টগুলি কেবল সংস্করণ> = 10 এ সমর্থিত, অনেক সাইট যেমন আই 8 এবং আই 9 এখনও কিছু প্রাসঙ্গিক ভাগ পায় তেমন যত্নবান।
le0diaz

45

এটি ইতিমধ্যে একটি "সঠিক" উত্তর সহ একটি খুব পুরানো প্রশ্ন তবে আমি ভেবেছিলাম যে আমি অন্য পদ্ধতির উল্লেখ করব যা এখানে কেউ উল্লেখ করেনি। এটি অনুলিপি করা হয়েছে এবং দুর্দান্ত আন্ডারস্কোর লাইব্রেরি থেকে আটকানো হয়েছে :

_.delay = function(func, wait) {
  var args = slice.call(arguments, 2);
  return setTimeout(function(){ return func.apply(null, args); }, wait);
};

আপনি সেটটাইমআউট দ্বারা ডাকা ফাংশনটিতে যতটা আর্গুমেন্ট পাস করতে পারেন এবং একটি যুক্ত বোনাস হিসাবে (ভাল, সাধারণত একটি বোনাস) আপনার ফাংশনে পাস হওয়া আর্গুমেন্টের মান হ'ল সেট হয়ে যায় যখন আপনি সেটটাইমআউট কল করবেন, তাই যদি তারা মান পরিবর্তন করে সেটটাইমআউট () বলা হয় এবং যখন এটি শেষ হয়ে যায় এর মাঝে কিছুটা সময়, ভাল ... এটি এতটা হতাশার সাথে আর হতাশ নয় :)

এখানে একটি মূর্খতা রয়েছে যেখানে আপনি কী বলতে চাইছেন তা দেখতে পাচ্ছেন।


7
এই উত্তরটি আসলে কাজ করে তবে আপনার কাছে এমন কিছু গ্রন্থাগার রয়েছে যা আমি পাই না। এটির কাজ করার জন্য এখানে সামান্য সংশোধন করা হয়েছে: স্লাইসকলের পরিবর্তে অ্যারে.প্রোটোটাইপ.স্লাইস.ক্ল্যাক্ট ব্যবহার করুন (যুক্তি, ২)
মেলানিয়া

7
@ মেলানির "কিছু লাইব্রেরী"? আমি উত্তরে বলেছিলাম যে এটি আন্ডারস্কোর লাইব্রেরি - আন্ডারস্কোরএস.আর.ও . তবে হ্যাঁ, অ্যারে.প্রোটোটাইপ.স্লাইস সেই লাইব্রেরির অভ্যন্তরে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টানতে হবে, তাই আপনি যদি এটি ব্যবহার না করেন, তবে ভাল জায়গাটিই আপনাকে করতে হবে :)
ডেভিড মিস্টার

38

আমি সম্প্রতি setTimeoutএকটি লুপে ব্যবহারের প্রয়োজনের অনন্য পরিস্থিতিটি দেখতে পেয়েছি । এটি বোঝা আপনাকে প্যারামিটারগুলিতে কীভাবে পাস করবে তা বুঝতে সহায়তা করতে পারে setTimeout

পদ্ধতি 1

সুকিমার পরামর্শ অনুসারে ব্যবহার করুন forEachএবং :Object.keys

var testObject = {
    prop1: 'test1',
    prop2: 'test2',
    prop3: 'test3'
};

Object.keys(testObject).forEach(function(propertyName, i) {
    setTimeout(function() {
        console.log(testObject[propertyName]);
    }, i * 1000);
});

আমি এই পদ্ধতি সুপারিশ।

পদ্ধতি 2

ব্যবহার bind:

var i = 0;
for (var propertyName in testObject) {
    setTimeout(function(propertyName) {
        console.log(testObject[propertyName]);
    }.bind(this, propertyName), i++ * 1000);
}

জেএসফিডাল: http://jsfiddle.net/MsBkW/

পদ্ধতি 3

বা যদি আপনি ব্যবহার করতে না পারেন forEachবা bind, একটি আইআইএফই ব্যবহার করুন :

var i = 0;
for (var propertyName in testObject) {
    setTimeout((function(propertyName) {
        return function() {
            console.log(testObject[propertyName]);
        };
    })(propertyName), i++ * 1000);
}

পদ্ধতি 4

তবে আপনি যদি আই <10 এর বিষয়ে চিন্তা না করেন তবে আপনি ফ্যাবিওর পরামর্শটি ব্যবহার করতে পারেন :

var i = 0;
for (var propertyName in testObject) {
    setTimeout(function(propertyName) {
        console.log(testObject[propertyName]);
    }, i++ * 1000, propertyName);
}

পদ্ধতি 5 (ES6)

একটি ব্লক স্কোপড ভেরিয়েবল ব্যবহার করুন:

let i = 0;
for (let propertyName in testObject) {
    setTimeout(() => console.log(testObject[propertyName]), i++ * 1000);
}

যদিও আমি এখনও ES6 এর Object.keysসাথে ব্যবহারের পরামর্শ দেব forEach


2
দ্রষ্টব্য: .bindআইই 8 এবং এর জন্য নীচে কাজ করবে না [রেফার: ডেভেলপার.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / ]]। : আমি Schien এর সলিউশন ব্যবহার শেষ পর্যন্ত stackoverflow.com/a/21213723/1876899
cjspurgeon

1
যদি আপনার একটি পরিবেশ ব্যবহার করে এ bindতারপর আপনার যে অফার একটা পরিবেশে Object.keysএবং forEach। আপনি লুপটি শিথিল করতে পারেন এবং একটি "ফ্রি" পেতে পারেন (যেমন দুটি পাখির মধ্যে একটি পাথরবিহীন রিসোর্স ফ্রি নয়) প্রক্রিয়াটির কার্যের সুযোগ রয়েছে।
সুকিমা

@ ডেভিড শেরেট আপনি যদি আগে এটি ব্যবহার না করেন তবে অবশ্যই asyncগ্রন্থাগারটি পরীক্ষা করুন ( github.com/caolan/async )। আমরা এটি সেলগুলিতে ব্যাপকভাবে ব্যবহার করি এবং গত 2 বছর ধরে দুর্দান্ত ফলাফল পেয়েছি। এটি উভয় সমান্তরাল এবং অ্যাসিঙ্ক্রোনাস জন্য সিরিজে পদ্ধতি প্রদান করে forEach, map, reduce, ইত্যাদি
mikermcneil

25

হাবলিন ইতিমধ্যে এই প্রশ্নটিতে মন্তব্য করেছে, তবে এটি সত্যই উত্তর হওয়া উচিত!

ব্যবহার Function.prototype.bind()cleanest এবং সবচেয়ে সহজ পদ্ধতি (সেট করতে সক্ষম নয় হওয়ার বোনাস সহ এই কাজ করতে thisপ্রেক্ষাপটে):

setTimeout(postinsql.bind(null, topicId), 4000);

আরও তথ্যের জন্য এই এমডিএন লিঙ্কগুলি দেখুন:
https://developer.mozilla.org/en/docs/DOM/window.setTimeout#highlitter_547041 https://developer.mozilla.org/en/docs/ / বেঁধে # With_setTimeout


এই প্রসঙ্গে setTimeout(postinsql.bind(this, topicId), 4000);
বাঁধনের

@ জিউস্পেপ গ্যালানো পুরোপুরি, আমি আমার উত্তরে উল্লেখ করেছি, তবে এই উদাহরণটির প্রয়োজন নেই :)
ডেইন

আংশিক অ্যাপ্লিকেশন ব্যবহার করে কত গ্লস আকর্ষণীয় bind। এটি সত্যই কিছু পঠনযোগ্য কোড তৈরি করে।
সুকিমা

বাইন্ড () কেবলমাত্র আইই 9 + থেকে সমর্থিত, তাই <আই 9
সঞ্জীব

@ সঞ্জীব এটি পুরানো আইই তে কাজ করতে ES5 শিম ব্যবহার করুন: github.com/es-shims/es5-shim
গ্রেজার

17

কিছু উত্তর সঠিক তবে সংশ্লেষিত।

4 বছর পরে আমি আবারও এর উত্তর দিচ্ছি, কারণ আমি এখনও এই প্রশ্নটি সমাধান করার জন্য অতিরিক্ত জটিল কোড নিয়ে চলেছি। একটি মার্জিত সমাধান আছে।

প্রথমত, সেটটাইমআউট কল করার সময় প্রথম প্যারামিটার হিসাবে স্ট্রিংয়ে পাস করবেন না কারণ এটি কার্যকরভাবে ধীর "ইভাল" ফাংশনে একটি কলকে আহ্বান করে।

সুতরাং কিভাবে আমরা একটি পরামিতি একটি সময়সীমা ফাংশন পাস করব? বন্ধ ব্যবহার করে:

settopic=function(topicid){
  setTimeout(function(){
    //thanks to closure, topicid is visible here
    postinsql(topicid);
  },4000);
}

...
if (xhr.readyState==4){
  settopic(xhr.responseText);
}

টাইমআউট ফাংশনটি কল করার সময় কেউ কেউ বেনামে ফাংশনটি ব্যবহার করার পরামর্শ দিয়েছেন:

if (xhr.readyState==4){
  setTimeout(function(){
    settopic(xhr.responseText);
  },4000);
}

বাক্য গঠন কাজ করে। কিন্তু সময় অনুযায়ী সেটটোপিক বলা হয়, অর্থাৎ 4 সেকেন্ড পরে, এক্সএইচআর অবজেক্টটি একই রকম নাও হতে পারে। অতএব ভেরিয়েবলগুলি প্রাক-বাঁধাই করা গুরুত্বপূর্ণ ।


1
পাঠযোগ্য সমাধানের জন্য +1, আমার থেকে কিছুটা আলাদা। আপনার যখন সেটটোপিক ফাংশনের অভ্যন্তরে সেটটাইমআউট রয়েছে, তখন আমার কাছে সেটটাইমআউট ফাংশনের ভিতরে fDelayed (আপনার সেটটোপিক) ফাংশন রয়েছে।
ডোমিনিক

11

আমার উত্তর:

setTimeout((function(topicId) {
  return function() {
    postinsql(topicId);
  };
})(topicId), 4000);

ব্যাখ্যা:

তৈরি করা বেনামি ফাংশন আবার একটি অনামী ফাংশন দেয়। এই ফাংশনটিতে মূলত পাস করা অ্যাক্সেস রয়েছে topicId, সুতরাং এটি কোনও ত্রুটি করবে না। প্রথম বেনাম ফাংশনটি তত্ক্ষণাত কল করে প্রবেশ করানো হচ্ছে topicId, সুতরাং বিলম্বের সাথে নিবন্ধিত ফাংশনটির topicIdকলিংয়ের মাধ্যমে কল করার সময় অ্যাক্সেস থাকতে পারে ।

অথবা

এটি মূলত রূপান্তর করে:

setTimeout(function() {
  postinsql(topicId); // topicId inside higher scope (passed to returning function)
}, 4000);

সম্পাদনা: আমি একই উত্তর দেখেছি, তাই তার দিকে তাকান। কিন্তু আমি তার উত্তর চুরি করিনি! আমি স্রেফ দেখতে ভুলে গেছি ব্যাখ্যাটি পড়ুন এবং দেখুন কোডটি বুঝতে সহায়তা করে কিনা।


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

এটি সেরা উত্তর but তবে একটি ক্লোন করতে হয়েছিল কারণ যখন মানগুলি topicIdসময়সীমার পরিবর্তনের ক্ষেত্রেও পরিবর্তিত হয়। একটি ক্লোন এটি ঠিক করেছে
21

10

প্রতিস্থাপন করা

 setTimeout("postinsql(topicId)", 4000);

সঙ্গে

 setTimeout("postinsql(" + topicId + ")", 4000);

বা আরও ভাল এখনও, একটি বেনাম ফাংশন সঙ্গে স্ট্রিং এক্সপ্রেশন প্রতিস্থাপন

 setTimeout(function () { postinsql(topicId); }, 4000);

সম্পাদনা করুন:

ব্রাউনস্টোনর মন্তব্য ভুল, এটি ফায়ারবাগ কনসোলে চালিয়ে বোঝানো হিসাবে এটি কাজ করবে

(function() {
  function postinsql(id) {
    console.log(id);
  }
  var topicId = 3
  window.setTimeout("postinsql(" + topicId + ")",4000); // outputs 3 after 4 seconds
})();

মনে রাখবেন যে আমি অন্যের সাথে একমত হয়েছি যে আপনার স্ট্রিংটি এড়ানো উচিত setTimeoutকারণ eval()এটি স্ট্রিংয়ের দিকে কল করবে এবং পরিবর্তে কোনও ফাংশন পাস করবে।


এটি কাজ করবে না কারণ পোস্টটাইমকিএল (টপিকআইড) এর ফলাফল সেটটাইমআউট দ্বারা কার্যকর করা হবে। আপনাকে প্রথম উত্তরের মতো কোনও ফাংশনে এটি মোড়ানো দরকার বা প্রোটোটাইপের .curry () - setTimeout (postinsql.curry (topidId), 4000) এর মতো সহায়ক ব্যবহার করতে হবে;
শুকস্টার

2
@ ব্রাউনস্টোন: এটি ভুল। সময় শেষ হওয়ার পরে স্ট্রিংটি মূল্যায়ন করা হবে।
মাইল

9

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

সেটটাইমআউট (ফাংশন, মিলিসেকেন্ড, প্যারাম 1, প্যারাম 2, ...)

যেমন।

function myFunction() {
  setTimeout(alertMsg, 3000, "Hello");
}

function alertMsg(message) {
    alert(message)
}

1
কেউ আমাকে বলতে পারেন কেন এই উত্তরটি পছন্দসই নয়? এটি আমার মতে সবচেয়ে সহজ উপায়! হিসাবে সহজsetTimeout( (p) => { console.log(p); }, 1000, "hi" );
মাজহার জান্ডসালিমি

1
হ্যাঁ! এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এমডিএন থেকে: বিকাশকারী.মোজিলা.আর.
হান

7

সেটটাইমআউটে প্যারামিটারগুলি সমর্থন করার জন্য সবচেয়ে সহজ ক্রস ব্রাউজার সমাধান:

setTimeout(function() {
    postinsql(topicId);
}, 4000)

আপনি যদি 9 9 বা তার চেয়ে কম সমর্থন না করেন তবে:

setTimeout(postinsql, 4000, topicId);

সেটটাইমআউট ডেস্কটপ ব্রাউজার সামঞ্জস্য

সেটটাইমআউট মোবাইল ব্রাউজারের সামঞ্জস্য

https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout


5

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

  1. সেটটাইমআউট জন্য প্যারাম ব্যবহার করুন
setTimeout(function(p){
//p == param1
},3000,param1);
  1. তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন (IIFE) ব্যবহার করুন
let param1 = 'demon';
setTimeout(function(p){
    // p == 'demon'
},2000,(function(){
    return param1;
})()
);
  1. প্রশ্নের সমাধান
function statechangedPostQuestion()
{
  //alert("statechangedPostQuestion");
  if (xmlhttp.readyState==4)
  {
    setTimeout(postinsql,4000,(function(){
        return xmlhttp.responseText;
    })());
  }
}

function postinsql(topicId)
{
  //alert(topicId);
}

4

আমি জানি এটি পুরানো তবে আমি এটিতে আমার (পছন্দসই) স্বাদ যুক্ত করতে চেয়েছিলাম।

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

var topicId = xmlhttp.responseText;
var fDelayed = function(tid) {
  return function() {
    postinsql(tid);
  };
}
setTimeout(fDelayed(topicId),4000);

বা সংক্ষিপ্ত:

var topicId = xmlhttp.responseText;
setTimeout(function(tid) {
  return function() { postinsql(tid); };
}(topicId), 4000);

4

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

নীচের উদাহরণে, currentListভেরিয়েবলটি আইআইএফই-তে প্রেরণ করা হয়, যা বিলম্বকৃত ক্রিয়াকলাপটি সঞ্চারিত না হওয়া পর্যন্ত এটি এটি বন্ধ করে সংরক্ষণ করে। currentListকোডটি দেখানোর সাথে সাথে ভেরিয়েবল পরিবর্তন হলেও, thesetInterval() হলেও, সঠিক কাজটি করবে।

এই আইআইএফই কৌশলটি ব্যতীত setTimeout()ফাংশনটি অবশ্যই ডিওমের প্রতিটি h2উপাদানের জন্য কল করবে তবে এই সমস্ত কলগুলি কেবলমাত্র শেষ h2 উপাদানটির পাঠ্য মানটি দেখতে পাবে ।

<script>
  // Wait for the document to load.
  $(document).ready(function() {
  $("h2").each(function (index) {

    currentList = $(this).text();

    (function (param1, param2) {
        setTimeout(function() {
            $("span").text(param1 + ' : ' + param2 );
        }, param1 * 1000);

    })(index, currentList);
  });
</script>

4

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

const someFunction = (params) => () => {
  //do whatever
};

setTimeout(someFunction(params), 1000);

বা যদি someFunctionপ্রথম অর্ডার হয়:

setTimeout(() => someFunction(params), 1000); 

এটি খুব বেমানান
ব্যবহারকারী 151496

সত্যিই মার্জিত! ধন্যবাদ
ভেলোজেট

3

নোট করুন যে কারণে ত্রুটি বার্তা অনুযায়ী বিষয়টিকে "সংজ্ঞায়িত" করা হয়নি তা হ'ল সেটটাইমআউট কার্যকর হওয়ার সময় এটি স্থানীয় ভেরিয়েবল হিসাবে উপস্থিত ছিল, তবে পোস্টিনসকিএল-এ বিলম্বিত কলটি ঘটেনি। পরিবর্তনশীল আজীবন বিশেষভাবে অবজেক্ট রেফারেন্স হিসাবে "এটি" পাশ করার মতো কিছু চেষ্টা করার সময় মনোযোগ দেওয়া বিশেষভাবে গুরুত্বপূর্ণ।

আমি শুনেছি যে আপনি টেক্সটআইডকে সেটটাইমআউট ফাংশনে তৃতীয় প্যারামিটার হিসাবে পাস করতে পারেন। খুব বেশি বিশদ দেওয়া হয়নি তবে এটি কাজ করার জন্য আমি যথেষ্ট তথ্য পেয়েছি এবং এটি সাফারিতে সফল। "মিলিসেকেন্ড ত্রুটি" সম্পর্কে তারা কী বোঝায় তা আমি জানি না। এটি এখানে দেখুন:

http://www.howtocreate.co.uk/tutorials/javascript/timers


3

আমি কিভাবে এই পর্যায়ে সমাধান?

এমনি :

setTimeout((function(_deepFunction ,_deepData){
    var _deepResultFunction = function _deepResultFunction(){
          _deepFunction(_deepData);
    };
    return _deepResultFunction;
})(fromOuterFunction, fromOuterData ) , 1000  );

সেটটাইমআউট কোনও ফাংশনের রেফারেন্সের জন্য অপেক্ষা করুন, তাই আমি এটি একটি বন্ধে তৈরি করেছি, যা আমার ডেটাটির ব্যাখ্যা করে এবং আমার ডেটার একটি ভাল উদাহরণ দিয়ে একটি ফাংশন ফিরিয়ে দেয়!

আপনি এই অংশটি উন্নত করতে পারেন:

_deepFunction(_deepData);

// change to something like :
_deepFunction.apply(contextFromParams , args); 

আমি এটি ক্রোম, ফায়ারফক্স এবং আইটিতে পরীক্ষা করেছিলাম এবং এটি কার্যকরভাবে সম্পাদন করে, আমি পারফরম্যান্স সম্পর্কে জানি না তবে এটি কাজ করার জন্য আমার এটির প্রয়োজন ছিল।

একটি নমুনা পরীক্ষা:

myDelay_function = function(fn , params , ctxt , _time){
setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
            var _deepResultFunction = function _deepResultFunction(){
                //_deepFunction(_deepData);
                _deepFunction.call(  _deepCtxt , _deepData);
            };
        return _deepResultFunction;
    })(fn , params , ctxt)
, _time) 
};

// the function to be used :
myFunc = function(param){ console.log(param + this.name) }
// note that we call this.name

// a context object :
myObjet = {
    id : "myId" , 
    name : "myName"
}

// setting a parmeter
myParamter = "I am the outer parameter : ";

//and now let's make the call :
myDelay_function(myFunc , myParamter  , myObjet , 1000)

// this will produce this result on the console line :
// I am the outer parameter : myName

আরও স্বীকৃত করতে আপনি স্বাক্ষরটি পরিবর্তন করতে পারেন:

myNass_setTimeOut = function (fn , _time , params , ctxt ){
return setTimeout((function(_deepFunction ,_deepData, _deepCtxt){
            var _deepResultFunction = function _deepResultFunction(){
                //_deepFunction(_deepData);
                _deepFunction.apply(  _deepCtxt , _deepData);
            };
        return _deepResultFunction;
    })(fn , params , ctxt)
, _time) 
};

// and try again :
for(var i=0; i<10; i++){
   myNass_setTimeOut(console.log ,1000 , [i] , console)
}

এবং মূল প্রশ্নের উত্তর দিতে চূড়ান্ত:

 myNass_setTimeOut( postinsql, 4000, topicId );

আশা করি এটি সাহায্য করতে পারে!

PS: দুঃখিত তবে ইংরেজি এটা আমার মাতৃভাষা নয়!


অন্যান্য উত্তরের তুলনায় এটি অত্যধিক জটিল।
ড্যান ড্যাসকলেসকু

3

এটি সমস্ত ব্রাউজারে কাজ করে (আইই একটি বিজোড় বল)

setTimeout( (function(x) {
return function() {
        postinsql(x);
    };
})(topicId) , 4000);

3

আপনি যদি পরম হিসাবে ভেরিয়েবল পাস করতে চান তবে এটি চেষ্টা করুন

যদি প্রয়োজন হয় ফাংশন এবং পরম হিসাবে var হয় তবে এটি চেষ্টা করুন

setTimeout((param1,param2) => { 
     alert(param1 + param2);
     postinsql(topicId);
},2000,'msg1', 'msg2')

যদি প্রয়োজনগুলি কেবলমাত্র প্যারাম হিসাবে পরিবর্তনশীল হয় তবে এটি ব্যবহার করে দেখুন

setTimeout((param1,param2) => { alert(param1 + param2) },2000,'msg1', 'msg2')

আপনি এটি ES5 এবং ES6 দিয়ে চেষ্টা করতে পারেন


2

আপনি এর মতো 'প্রয়োগ ()' এর ডিফল্ট কার্যকারিতা চেষ্টা করতে পারেন, আপনি অ্যারেতে আরও প্রয়োজনীয় যুক্তিগুলি পাস করতে পারেন

function postinsql(topicId)
{
  //alert(topicId);
}
setTimeout(
       postinsql.apply(window,["mytopic"])
,500);

1

সেটটাইমআউট WHAT ডাব্লু দ্বারা সংজ্ঞায়িত DOM এর অংশ।

https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html

আপনি যে পদ্ধতিটি চান তা হ'ল: -

handle = self.setTimeout( handler [, timeout [, arguments... ] ] )

টাইমআউট মিলিসেকেন্ডের পরে হ্যান্ডলার চালনার সময়সীমা নির্ধারণ করে। কোনও আর্গুমেন্ট হ্যান্ডলারের মাধ্যমে সোজা হয়ে যায়।

setTimeout(postinsql, 4000, topicId);

স্পষ্টতই, অতিরিক্ত 10 টি আর্গুমেন্ট আইই 10 তে সমর্থিত। বিকল্পভাবে, আপনি ব্যবহার করতে পারেনsetTimeout(postinsql.bind(null, topicId), 4000); , তবে অতিরিক্ত তর্কগুলি পাস করা সহজ, এবং এটি আরও ভাল।

.তিহাসিক ঘটনাবলি: ভিবিএস স্ক্রিপ্টের দিনগুলিতে, জেএসক্রিপ্টে, সেটটাইমআউটের তৃতীয় প্যারামিটারটি ছিল একটি স্ট্রিং হিসাবে, "জেএসক্রিপ্ট" এ ডিফল্ট হলেও "ভিবিএস স্ক্রিপ্ট" ব্যবহারের বিকল্প ছিল। https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa741500(v%3Dvs.85)


0

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

সুতরাং, আমি @ মধ্যস্থতার উত্তর অনুসরণ করেছি এবং এই কোড দিয়ে আমার সমস্যাটি সমাধান করেছি:

$('.targetItemClass').hover(ItemHoverIn, ItemHoverOut);

function ItemHoverIn() {
 //some code here
}

function ItemHoverOut() {
    var THIS = this;
    setTimeout(
        function () { ItemHoverOut_timeout(THIS); },
        100
    );
}
function ItemHoverOut_timeout(target) {
    //do something with target which is hovered out
}

আশা করি, এটি অন্য কারও জন্য উপকারী।


0

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

আমরা এই জাতীয় পুনরাবৃত্তি ব্যবহার করে চেষ্টা করতে পারি:

var i = 0;
var hellos = ["Hello World1!", "Hello World2!", "Hello World3!", "Hello World4!", "Hello World5!"];

if(hellos.length > 0) timeout();

function timeout() {                
    document.write('<p>' + hellos[i] + '<p>');
    i++;
    if (i < hellos.length)
        setTimeout(timeout, 500);
}

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


0

// এই তিনটি খুব সহজ এবং সংক্ষিপ্ত উত্তর:

function fun() {
    console.log(this.prop1, this.prop2, this.prop3);
}

let obj = { prop1: 'one', prop2: 'two', prop3: 'three' };

let bound = fun.bind(obj);

setTimeout(bound, 3000);

 // or

function funOut(par1, par2, par3) {

  return function() { 

    console.log(par1, par2, par3);

  }
};

setTimeout(funOut('one', 'two', 'three'), 5000);

 // or

let funny = function(a, b, c) { console.log(a, b, c); };

setTimeout(funny, 2000, 'hello', 'worldly', 'people');

0

প্রশ্নের উত্তর দেওয়া কিন্তু 2 টি যুক্তি সহ একটি সাধারণ সংযোজন ফাংশন দ্বারা।

var x = 3, y = 4;

setTimeout(function(arg1, arg2) { 
      delayedSum(arg1, arg2);
}(x, y), 1000);

function delayedSum(param1, param2) {
     alert(param1 + param2); // 7
}


-1

আমি মনে করি আপনি চান:

setTimeout("postinsql(" + topicId + ")", 4000);

1
আমি এমন দৃষ্টান্তগুলিতে চলে এসেছি যেখানে এটি কেবল কার্যকর হয় না (সর্বদা একটি 'ফাংশন সংজ্ঞায়িত নয়' ত্রুটির ফলস্বরূপ) তবে বেনামে ফাংশনটি ব্যবহার করে কাজ করে। যা হতাশাব্যঞ্জক যে সবাই মনে করে উপরের সিনট্যাক্সটি সর্বদা কাজ করা উচিত। (এটি এমন কি হতে পারে যে jQuery কোনওভাবে 'স্ট্রিং হিসাবে উদ্ধৃতি' পদ্ধতির পথে চলে?)
ডিএ।

6
ধরা যাক সেই টপিকটি আইডি একটি ফাংশন ... বা কোনও অবজেক্ট। এটি কাজ করবে না!
Serafeim

আপনি যদি সত্যিই এই পদ্ধতিটি নিয়ে এগিয়ে যেতে চান তবে JSON.stringifyনিয়মিত অবজেক্ট এবং অ্যারে ব্যবহার করুন এবং তারপরে JSON.parseফাংশনের অভ্যন্তরে ব্যবহার করুন। তবে, অবজেক্টটির পদ্ধতি থাকলে সমস্ত আচরণ নষ্ট হবে lost
ডার্থকেডিয়াস

-2

// এই তিনটি খুব সহজ এবং সংক্ষিপ্ত উত্তর:

function fun() {
    console.log(this.prop1, this.prop2, this.prop3);
}

let obj = { prop1: 'one', prop2: 'two', prop3: 'three' };

let bound = fun.bind(obj);

setTimeout(bound, 3000);

 // or

function funOut(par1, par2, par3) {

  return function() { 

    console.log(par1, par2, par3);

  }
};

setTimeout(funOut('one', 'two', 'three'), 5000);

 // or

let funny = function(a, b, c) { console.log(a, b, c); };

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