Jika saya memiliki waktu tunggu aktif yang berjalan yang telah diatur var t = setTimeout("dosomething()", 5000)
,
Apakah ada cara untuk menjeda dan melanjutkannya?
Adakah cara untuk mendapatkan waktu yang tersisa pada waktu tunggu saat ini?
atau haruskah saya dalam variabel, ketika waktu tunggu diatur, simpan waktu saat ini, lalu kita jeda, dapatkan perbedaan antara sekarang dan nanti?
javascript
timeout
Hailwood
sumber
sumber
Jawaban:
Anda bisa membungkus
window.setTimeout
seperti ini, yang menurut saya mirip dengan apa yang Anda sarankan dalam pertanyaan:sumber
setTimeout()
tidak berfungsi di Internet Explorer <= 9.timer.resume(); timer.resume();
Anda akan memiliki dua batas waktu secara paralel. Itulah mengapa Anda ingin melakukannyaclearTimeout(timerId)
terlebih dahulu atau melakukanif (timerId) return;
korsleting di awal resume.var timerId, start, remaining;
luar lingkup Kelas dan menambahkanremaining = delay;
kembali ke dalam untuk menangkap parameter. Bekerja seperti pesona!if (blah) { ... }
) atau sesuatu?Sesuatu seperti ini seharusnya berhasil.
sumber
+new Date()
menjadinew Date().getTime()
karena lebih cepat: jsperf.com/date-vs-gettimeTidak. Anda harus membatalkannya (
clearTimeout
), mengukur waktu sejak Anda memulainya dan memulai ulang dengan waktu yang baru.sumber
Versi jawaban Tim Downs yang sedikit dimodifikasi . Namun, sejak Tim membatalkan suntingan saya, saya sendiri yang menjawabnya. Solusi saya memungkinkan untuk menggunakan ekstra
arguments
sebagai parameter ketiga (3, 4, 5 ...) dan untuk menghapus pengatur waktu:Seperti yang disebutkan Tim, parameter tambahan tidak tersedia di
IE lt 9
, namun saya bekerja sedikit agar dapat berfungsioldIE
juga.Pemakaian:
new Timer(Function, Number, arg1, arg2, arg3...)
sumber
"Jeda" dan "lanjutkan" tidak terlalu masuk akal dalam konteksnya
setTimeout
, yang merupakan hal satu kali . Apakah yang Anda maksudsetInterval
? Jika demikian, tidak, Anda tidak dapat menjedanya, Anda hanya dapat membatalkannya (clearInterval
) lalu menjadwalkan ulang lagi. Detail semua ini ada di bagian Timer pada spesifikasi.sumber
Timeout cukup mudah untuk menemukan solusinya, tetapi Interval sedikit lebih rumit.
Saya datang dengan dua kelas berikut untuk menyelesaikan masalah ini:
Ini dapat diimplementasikan seperti:
Contoh ini akan menyetel Timeout yang dapat dijeda (pt_hey) yang dijadwalkan untuk memberi peringatan, "hey" setelah dua detik. Timeout lain menjeda pt_hey setelah satu detik. Timeout ketiga melanjutkan pt_hey setelah dua detik. pt_hey berjalan selama satu detik, berhenti sebentar, kemudian melanjutkan berjalan. pt_hey terpicu setelah tiga detik.
Sekarang untuk interval yang lebih rumit
Contoh ini menyetel Interval yang dapat dijeda (pi_hey) untuk menulis "hello world" di konsol setiap dua detik. Sebuah timeout menjeda pi_hey setelah lima detik. Batas waktu lain melanjutkan pi_hey setelah enam detik. Jadi pi_hey akan memicu dua kali, lari selama satu detik, jeda selama satu detik, lari selama satu detik, lalu lanjutkan memicu setiap 2 detik.
FUNGSI LAINNYA
clearTimeout () dan clearInterval ()
pt_hey.clearTimeout();
danpi_hey.clearInterval();
berfungsi sebagai cara mudah untuk menghapus batas waktu dan interval.getTimeLeft ()
pt_hey.getTimeLeft();
danpi_hey.getTimeLeft();
akan mengembalikan berapa milidetik hingga pemicu berikutnya dijadwalkan untuk terjadi.sumber
setInterval
? Saya pikir yang sederhanaif(!true) return;
akan berhasil, atau apakah saya salah?Saya perlu menghitung waktu yang telah berlalu dan yang tersisa untuk menunjukkan bilah kemajuan. Tidak mudah menggunakan jawaban yang diterima. 'setInterval' lebih baik daripada 'setTimeout' untuk tugas ini. Jadi, saya membuat kelas Timer ini yang dapat Anda gunakan dalam proyek apa pun.
https://jsfiddle.net/ashraffayad/t0mmv853/
sumber
/menghidupkan kembali
Versi ES6 menggunakan gula sintaksis Kelas-y đź’‹
(sedikit dimodifikasi: ditambahkan awal ())
sumber
Anda bisa melihat ke clearTimeout ()
atau jeda bergantung pada variabel global yang disetel saat kondisi tertentu tercapai. Seperti tombol yang ditekan.
sumber
Anda juga bisa menerapkannya dengan acara.
Alih-alih menghitung perbedaan waktu, Anda mulai dan berhenti mendengarkan acara 'centang' yang terus berjalan di latar belakang:
sumber
Jika Anda menggunakan jquery, lihat $ .doTimeout plugin . Hal ini merupakan peningkatan besar atas setTimeout, termasuk membiarkan Anda melacak time-out Anda dengan id string tunggal yang Anda tentukan dan tidak berubah setiap kali Anda menyetelnya, dan menerapkan pembatalan mudah, polling loop & debouncing, dan lebih. Salah satu plugin jquery saya yang paling banyak digunakan.
Sayangnya, itu tidak mendukung jeda / melanjutkan di luar kotak. Untuk ini, Anda perlu membungkus atau memperpanjang $ .doTimeout, mungkin mirip dengan jawaban yang diterima.
sumber
Saya harus bisa menjeda setTimeout () untuk fitur seperti slideshow.
Berikut adalah implementasi saya sendiri dari pengatur waktu yang dapat dijeda. Ini mengintegrasikan komentar yang terlihat pada jawaban Tim Down, seperti jeda yang lebih baik (komentar kernel) dan bentuk prototipe (komentar Umur Gedik.)
Contoh:
Untuk menguji kode, gunakan
timer.resume()
dantimer.pause()
beberapa kali dan periksa berapa banyak waktu yang tersisa. (Pastikan konsol Anda terbuka.)Menggunakan objek ini sebagai pengganti setTimeout () semudah menggantinya
timerID = setTimeout( mycallback, 1000)
dengantimer = new Timer( mycallback, 1000 )
. Kemudiantimer.pause()
dantimer.resume()
tersedia untuk Anda.sumber
Demo kerja "asinkron" di: situs zarsoft.info
sumber
Implementasi skrip ketikan berdasarkan jawaban teratas
sumber
Anda dapat melakukan seperti di bawah ini untuk membuat setTimeout dapat dijeda di sisi server (Node.js)
dan Anda dapat memeriksanya seperti di bawah ini
sumber
Saya tidak berpikir Anda akan menemukan sesuatu yang lebih baik dari clearTimeout . Bagaimanapun, Anda selalu dapat menjadwalkan waktu tunggu lain nanti, alih-alih 'melanjutkan'.
sumber
Jika Anda memiliki beberapa div untuk disembunyikan, Anda dapat menggunakan
setInterval
dan sejumlah siklus untuk melakukan seperti di:sumber