Saya belajar jQuery, dan saya mencoba menemukan contoh kode sederhana yang akan meminta sebuah API untuk suatu kondisi. (yaitu, minta halaman web setiap beberapa detik dan proses hasilnya)
Saya terbiasa dengan cara melakukan AJAX di jQuery, saya tidak bisa menemukan cara yang "tepat" untuk menjalankannya pada "pengatur waktu".
setTimeout
dan beberapa telah menggunakansetInterval
. Mengapa seseorang lebih disukai daripada yang lain?setTimeout
berada dalam penangan sukses tetapi malah merantai panggilan ajax dengan jQuery selalu . Seperti ini:$.post('ajax/test.html') .done(function(data) { /* process */ }) .always(function() { setTimeout(doPoll, 5000); });
Berikut adalah artikel bermanfaat tentang polling panjang (permintaan HTTP lama) menggunakan jQuery. Cuplikan kode yang berasal dari artikel ini:
Ini akan membuat permintaan berikutnya hanya setelah permintaan ajax selesai.
Variasi di atas yang akan langsung dijalankan saat pertama kali dipanggil sebelum mengikuti interval tunggu / waktu tunggu.
sumber
let is_success = false; (function poll() { let timeout = setTimeout(function() { $.ajax({ url: resp.location, type: "GET", success: function(data) { if(YOUR_CONDITION) { is_success=true; } }, dataType: "json", complete: poll, timeout: 2000 }) }, 5000); if(is_success) { console.log("ending poll"); window.clearTimeout(timeout); } })();
Dari ES6,
sumber
sumber
setInterval(poll, 5000);
sumber
jQuery.Deferred () dapat menyederhanakan pengelolaan pengurutan asinkron dan penanganan error.
Ini adalah pendekatan yang elegan, tetapi ada beberapa gotcha ...
then()
segera gagal, callback harus mengembalikan objek lain yang dapat digunakan (mungkin yang lainDeferred
), yang sama-sama dilakukan oleh garis sleep dan ajax.sumber
initiate_polling
dijalankan hingga selesai.new Promise( resolve => setTimeout(resolve,1000) ).then( () => alert("done") )
sumber
Saya membuat plugin JQuery kecil untuk ini. Anda dapat mencobanya:
https://www.npmjs.com/package/jquerypoll
sumber
Solusi ini:
Versi minimum jQuery adalah 1.12
sumber