কীভাবে পর্যায়ক্রমে এজেএক্স অনুরোধটি ফায়ার করবেন?


113
<meta http-equiv="Refresh" Content="5">

এই স্ক্রিপ্টটি প্রতি 5 সেকেন্ড পরে পৃষ্ঠাটি পুনরায় লোড করে বা রিফ্রেশ করে। তবে আমি jQuery এবং AJAX কল ব্যবহার করে এটি করতে চাই। এটা কি সম্ভব?

উত্তর:


281

অন্যরা সেট ইন্টেরওয়াল এবং সেটটাইমআউটটি কৌশলটি দেখায়। আমি একটু আরো উন্নত পন্থা যা আমি পল আইরিশ দ্বারা এই চমৎকার ভিডিও থেকে শিখেছি হাইলাইট করতে চেয়েছিলাম: http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/

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

// Use a named immediately-invoked function expression.
(function worker() {
  $.get('ajax/test.html', function(data) {
    // Now that we've completed the request schedule the next one.
    $('.result').html(data);
    setTimeout(worker, 5000);
  });
})();

সরলতার জন্য আমি সময় নির্ধারণের জন্য সাফল্য কলব্যাক ব্যবহার করেছি। এর নীচের দিকের একটি ব্যর্থ অনুরোধ আপডেটগুলি থামিয়ে দেবে। এটি এড়াতে আপনি পরিবর্তে সম্পূর্ণ কলব্যাক ব্যবহার করতে পারেন:

(function worker() {
  $.ajax({
    url: 'ajax/test.html', 
    success: function(data) {
      $('.result').html(data);
    },
    complete: function() {
      // Schedule the next request when the current one's complete
      setTimeout(worker, 5000);
    }
  });
})();

3
এটি কি পুনরাবৃত্তির ফাংশন কলের মতো নয়? যদি হ্যাঁ, তবে এটি পুনরাবৃত্তি হওয়ার কারণে এটি দীর্ঘ সময় ধরে বেশি সময় ধরে চলতে দেওয়া কি ঠিক হবে? অজ্যাক্স সফলভাবে সম্পাদন করতে পারে ততক্ষণ অসীম পুনরাবৃত্তির ঘটনা হতে পারে
রাহুল দোল

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

16
@ রাহুলডোল এটি একটি ভাল প্রশ্ন তবে এটি পুনরাবৃত্ত হয় না। এটি সরাসরি কর্মী ক্রিয়াকলাপ থেকে ডাকা হয় না, তাই স্ট্যাকটি বাড়তে থাকবে না। আপনার দ্বিতীয় দফার জন্য, সেটটাইমআউট () এর জন্য দস্তাবেজগুলি চেকআউট করুন এবং আপনি এটি দেখতে পাবেন যে এটি একটি সংখ্যাসূচক আইডি প্রদান করবে যা ক্লিয়ারটাইমআউট () এ পাস হতে পারে।
ড্রইভ করুন

7
আপনি যদি ক্রোমে থাকেন তবে কোনও ফাংশনের কল স্ট্যাক দেখতে কনসোল.ট্রেস () ব্যবহার করে ক্রোম খেলছেন @ সেটটাইমআউট () দ্বারা চালিত ফাংশনগুলির মধ্যে খুব সংক্ষিপ্ত স্ট্যাক থাকবে এবং এতে অবশ্যই সেট ফাংশনটি অন্তর্ভুক্ত হবে না যা সেটটাইমআউট () বলে।
অনুমান করুন

1
@ আনুপাল শুধু একটি নতুন প্রশ্ন তৈরি করুন।
18:25 এ অনুমান করুন

34

হ্যাঁ, আপনি যে কোডটি চালাতে চান তাতে আপনি জাভাস্ক্রিপ্ট setTimeout()পদ্ধতি বা setInterval()পদ্ধতিটি ব্যবহার করতে পারেন । সেটটাইমআউট দিয়ে আপনি এটি কীভাবে করতে পারেন তা এখানে:

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

1
স্রেফ সেটটাইমআউট (এক্সিকিউটিউ কিউরি, 5000) ব্যবহার করুন; সেটটাইমআউট ('এক্সিকিউটকিউরি ()', 5000) এর পরিবর্তে; - এটি সংক্ষিপ্ত এবং দ্রুত।
আরএসপি

4

আপনি ব্যবহার করতে পারেন setTimeoutবা setInterval

পার্থক্যটি হ'ল সেটটাইমআউট আপনার ফাংশনটি একবারে ট্রিগার করে এবং তারপরে আপনাকে এটি আবার সেট করতে হবে। সেটআইন্টারভাল বারবার অভিব্যক্তিটি ট্রিগার করে রাখে, যদি না আপনি এটি বন্ধ করতে বলেন


1

আমি নীচের কোডটি চেষ্টা করেছিলাম,

    function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  setTimeout(executeQuery, 5000); // you could choose not to continue on failure...
}

$(document).ready(function() {
  // run the first time; all subsequent calls will take care of themselves
  setTimeout(executeQuery, 5000);
});

এটি নির্দিষ্ট বিরতি হিসাবে প্রত্যাশার মতো কাজ করে নি, পৃষ্ঠাটি পুরোপুরি লোড হয়নি এবং ক্রিয়াটি অবিচ্ছিন্নভাবে ডাকা হয়েছিল। তার ভাল ডাকতে setTimeout(executeQuery, 5000);বাইরে executeQuery()নীচের হিসাবে একটি পৃথক ফাংশন মধ্যে,

function executeQuery() {
  $.ajax({
    url: 'url/path/here',
    success: function(data) {
      // do something with the return value here if you like
    }
  });
  updateCall();
}

function updateCall(){
setTimeout(function(){executeQuery()}, 5000);
}

$(document).ready(function() {
  executeQuery();
});

এটি ঠিক মতো কাজ করেছিল।

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