Itu ada cara untuk mengkonfigurasi setInterval
metode javascript untuk menjalankan metode segera dan kemudian dijalankan dengan timer
javascript
setinterval
Jorge
sumber
sumber
function
sekali dan kemudian melakukansetInterval()
Jawaban:
Ini paling sederhana untuk langsung memanggil fungsi itu sendiri secara langsung:
Namun ada alasan yang baik untuk dihindari
setInterval
- khususnya dalam beberapa keadaan, seluruhsetInterval
peristiwa dapat tiba setelah satu sama lain tanpa penundaan. Alasan lain adalah bahwa jika Anda ingin menghentikan loop Anda harus secara eksplisit memanggilclearInterval
yang berarti Anda harus mengingat pegangan yang dikembalikan darisetInterval
panggilan asli .Jadi metode alternatif adalah
foo
memicu sendiri untuk panggilan berikutnya menggunakansetTimeout
sebagai gantinya:Ini menjamin bahwa setidaknya ada interval di
delay
antara panggilan. Ini juga membuatnya lebih mudah untuk membatalkan loop jika diperlukan - Anda hanya tidak meneleponsetTimeout
ketika kondisi terminasi loop Anda tercapai.Lebih baik lagi, Anda bisa membungkus semuanya dalam ekspresi fungsi yang dipanggil langsung yang menciptakan fungsi, yang kemudian memanggil dirinya lagi seperti di atas, dan secara otomatis memulai loop:
yang mendefinisikan fungsi dan memulai siklus semuanya sekaligus.
sumber
setTimeout
?setInterval
acara dapat tiba segera setelah satu sama lain tanpa penundaan.setTimeout
metode ini?Saya tidak yakin apakah saya memahami Anda dengan benar, tetapi Anda dapat dengan mudah melakukan sesuatu seperti ini:
Jelas ada sejumlah cara untuk melakukan ini, tapi itu cara paling ringkas yang bisa saya pikirkan.
sumber
arguments.callee
tidak tersedia dalam mode ketat ES5Saya menemukan pertanyaan ini karena masalah yang sama tetapi tidak ada jawaban yang membantu jika Anda perlu berperilaku persis seperti
setInterval()
tetapi dengan satu - satunya perbedaan fungsi dipanggil segera di awal.Ini solusi saya untuk masalah ini:
Keuntungan dari solusi ini:
setInterval
dapat dengan mudah diadaptasi oleh substitusiclearInterval()
nantiContoh:
Untuk menjadi kurang ajar, jika Anda benar-benar perlu menggunakan
setInterval
maka Anda juga bisa mengganti yang aslisetInterval
. Karenanya, tidak diperlukan perubahan kode saat menambahkan ini sebelum kode yang ada:Namun, semua keuntungan sebagaimana tercantum di atas berlaku di sini, tetapi tidak diperlukan penggantian.
sumber
setTimeout
solusi karena mengembalikansetInterval
objek. Untuk menghindari fungsi panggilan yang mungkin kemudian dalam kode dan karena itu tidak terdefinisi pada waktu saat ini, saya bungkus panggilan fungsi pertama dalamsetTimeout
fungsi seperti ini:setTimeout(function(){ func();},0);
Fungsi pertama kemudian dipanggil setelah siklus pemrosesan saat ini, yang juga segera , tetapi lebih banyak kesalahan terbukti.Anda bisa membungkus
setInterval()
fungsi yang menyediakan perilaku itu:... lalu gunakan seperti ini:
sumber
Ini adalah pembungkus untuk cantik-cantik jika Anda membutuhkannya:
Setel argumen ketiga setInterval ke true dan itu akan berjalan untuk pertama kalinya segera setelah memanggil setInterval:
Atau hilangkan argumen ketiga dan itu akan mempertahankan perilaku aslinya:
Beberapa browser mendukung argumen tambahan untuk setInterval yang tidak diperhitungkan oleh wrapper ini; Saya pikir ini jarang digunakan, tetapi ingatlah itu jika Anda memang membutuhkannya.
sumber
Untuk seseorang perlu membawa bagian luar
this
seolah-olah itu adalah fungsi panah.Jika sampah yang dihasilkan di atas mengganggu Anda, Anda dapat melakukan penutupan.
Atau mungkin mempertimbangkan menggunakan yang
@autobind
dekorator tergantung pada kode Anda.sumber
Saya akan menyarankan memanggil fungsi dalam urutan berikut
Anda juga dapat meneruskannya
_timer
ke foo, jika Anda inginclearInterval(_timer)
pada kondisi tertentusumber
Ini adalah versi sederhana untuk pemula tanpa semua masalah. Itu hanya menyatakan fungsi, memanggilnya, lalu memulai interval. Itu dia.
sumber
Untuk mengatasi masalah ini, saya menjalankan fungsi ini pertama kali setelah halaman dimuat.
sumber
Ada paket npm yang mudah disebut firstInterval (pengungkapan penuh, ini milik saya).
Banyak contoh di sini tidak termasuk penanganan parameter, dan mengubah perilaku default
setInterval
dalam setiap proyek besar adalah kejahatan. Dari dokumen:Pola ini
identik dengan
Jika Anda jadul di peramban dan tidak menginginkan ketergantungan, ini adalah cara mudah dan tempel dari kode.
sumber
Ok ini sangat kompleks, jadi, izinkan saya menjelaskannya lebih sederhana:
sumber
Anda dapat mengatur waktu tunda awal yang sangat kecil (mis. 100) dan mengaturnya ke waktu tunda yang Anda inginkan dalam fungsi:
sumber
Ada masalah dengan panggilan asinkron langsung dari fungsi Anda, karena setTimeout / setInterval standar memiliki batas waktu minimal sekitar beberapa milidetik bahkan jika Anda langsung menetapkannya ke 0. Ini disebabkan oleh pekerjaan khusus browser.
Contoh kode dengan penundaan nol NYATA yang berfungsi di Chrome, Safari, Opera
Anda dapat menemukan informasi lebih lanjut di sini
Dan setelah panggilan manual pertama Anda dapat membuat interval dengan fungsi Anda.
sumber
sebenarnya yang tercepat untuk dilakukan
ini akan memanggil fungsi saya, dan kemudian akan melakukannya setiap 45 detik yang berbeda dari melakukan
yang tidak akan menyebutnya, tapi jadwalkan saja
sumber
myFunction()
mengembalikan sendiri. Alih-alih memodifikasi setiap fungsi untuk dipanggil olehsetInterval
itu adalah pendekatan yang lebih baik untuk membungkussetInterval
sekali seperti yang diusulkan jawaban lainnya.