Saya ingin menambahkan penundaan / tidur di dalam satu while
lingkaran:
Saya mencobanya seperti ini:
alert('hi');
for(var start = 1; start < 10; start++) {
setTimeout(function () {
alert('hello');
}, 3000);
}
Hanya skenario pertama yang benar: setelah ditampilkan alert('hi')
, itu akan menunggu selama 3 detik kemudian alert('hello')
akan ditampilkan tetapi kemudian alert('hello')
akan berulang kali terus-menerus.
Yang saya inginkan adalah setelah alert('hello')
ditampilkan 3 detik setelah alert('hi')
itu perlu menunggu selama 3 detik untuk kedua kalinya alert('hello')
dan seterusnya.
sumber
for in
loop?Object.keys()
setTimeout
dengansetInterval
. Timeout secara implisit dihancurkan ketika callback dipanggil.Coba sesuatu seperti ini:
sumber
Jika menggunakan ES6, Anda dapat menggunakannya
let
untuk mencapai ini:Apa yang
let
dilakukan adalah mendeklarasikani
untuk setiap iterasi , bukan loop. Dengan cara ini, apa yang diteruskansetTimeout
adalah apa yang kita inginkan.sumber
i*3000
argumen, di dalam loop, dan meneruskannyasetTimeout
dengan nilai. Penggunaanlet
adalah opsional dan tidak terkait dengan pertanyaan dan jawaban.i < 10
) sehingga Anda akan memiliki beberapa timer bekerja secara paralel yang membuat alokasi memori dan lebih buruk pada jumlah iterasi yang lebih besar.Karena ES7 ada cara yang lebih baik untuk menunggu perulangan:
Ketika mesin mencapai
await
bagian, itu menetapkan batas waktu dan menghentikan eksekusiasync function
. Kemudian ketika batas waktu selesai, eksekusi berlanjut pada titik itu. Itu cukup berguna karena Anda dapat menunda (1) loop bersarang, (2) kondisional, (3) fungsi bersarang:Referensi tentang MDN
Sementara ES7 sekarang didukung oleh NodeJS dan peramban modern, Anda mungkin ingin mengubahnya dengan BabelJS sehingga dapat berjalan di mana-mana.
sumber
break;
mungkin?Cara lain adalah memperbanyak waktu ke waktu habis, tetapi perhatikan bahwa ini tidak seperti tidur . Kode setelah loop akan dieksekusi segera, hanya eksekusi fungsi callback yang ditunda.
Batas waktu pertama akan diatur ke
3000 * 1
, yang kedua ke3000 * 2
dan seterusnya.sumber
start
dalam fungsi Anda menggunakan metode ini.Ini akan bekerja
Coba biola ini: https://jsfiddle.net/wgdx8zqq/
sumber
$.Deferred
tetapi ada beberapa skenario yang berbeda untuk membuatnya bekerja, jempol kepada Anda ..!Saya pikir Anda perlu sesuatu seperti ini:
Kode uji:
Catatan: menggunakan lansiran peringatan pelaksanaan javascript hingga Anda menutup lansiran. Mungkin lebih banyak kode daripada yang Anda minta, tetapi ini adalah solusi yang dapat digunakan kembali yang kuat.
sumber
Saya mungkin akan menggunakan
setInteval
. Seperti ini,sumber
SetInterval()
terus memunculkan 'utas' bahkan jika terjadi beberapa kesalahan atau blok.Dalam ES6 (ECMAScript 2015) Anda dapat beralih dengan penundaan dengan generator dan interval.
Contoh kode:
Jadi jika Anda menggunakan ES6, itu cara yang paling elegan untuk mencapai loop dengan penundaan (menurut saya).
sumber
Anda dapat menggunakan operator interval RxJS . Interval memancarkan integer setiap x jumlah detik, dan take menentukan berapa kali harus memancarkan angka
sumber
Hanya berpikir saya akan memposting dua sen saya di sini juga. Fungsi ini menjalankan perulangan berulang dengan penundaan. Lihat jsfiddle ini . Fungsinya sebagai berikut:
Sebagai contoh:
Akan sama dengan:
sumber
Saya melakukan ini dengan Bluebird
Promise.delay
dan rekursi.sumber
Di ES6 Anda dapat melakukan hal berikut:
Di ES5 Anda dapat melakukan sebagai:
Alasannya adalah,
let
memungkinkan Anda untuk mendeklarasikan variabel yang terbatas pada cakupan pernyataan blok, atau ekspresi yang digunakannya, tidak sepertivar
kata kunci, yang mendefinisikan variabel secara global, atau secara lokal ke seluruh fungsi tanpa memperhatikan cakupan blok.sumber
Tampilkan cuplikan kode
Versi modifikasi dari jawaban Daniel Vassallo, dengan variabel diekstraksi ke dalam parameter untuk membuat fungsi lebih dapat digunakan kembali:
Pertama mari kita mendefinisikan beberapa variabel penting:
Selanjutnya Anda harus mendefinisikan fungsi yang ingin Anda jalankan. Ini akan melewati i, indeks saat ini dari loop dan panjang dari loop, jika Anda membutuhkannya:
Versi yang dapat dieksekusi sendiri
Versi fungsional
sumber
sumber
Anda melakukannya:
sumber
sumber
Inilah cara saya membuat loop tak terbatas dengan penundaan yang terputus pada kondisi tertentu:
Kuncinya di sini adalah untuk membuat Janji baru yang diselesaikan dengan batas waktu, dan untuk menunggu resolusi.
Jelas Anda perlu dukungan async / menunggu untuk itu. Bekerja di Node 8.
sumber
untuk penggunaan umum "lupakan loop normal" dan gunakan kombinasi "setInterval" ini termasuk "setTimeOut" s: seperti ini (dari tugas sebenarnya).
PS: Memahami bahwa perilaku nyata (setTimeOut): mereka semua akan mulai dalam waktu yang sama "tiga bla bla bla akan mulai menghitung mundur pada saat yang sama" jadi buat batas waktu berbeda untuk mengatur eksekusi.
PS 2: contoh untuk timing loop, tetapi untuk loop reaksi Anda dapat menggunakan acara, janji async tunggu ..
sumber
sumber
Setahu saya
setTimeout
fungsinya disebut asinkron. Yang dapat Anda lakukan adalah membungkus seluruh loop dalam fungsi async dan menungguPromise
yang berisi setTimeout seperti yang ditunjukkan:Dan kemudian Anda menyebutnya jalankan seperti ini:
Silakan luangkan waktu untuk mendapatkan pemahaman yang baik tentang pemrograman asinkron.
sumber
Coba saja ini
Hasil
sumber
Berikut adalah fungsi yang saya gunakan untuk mengulang array:
Anda menggunakannya seperti ini:
sumber
Skrip ini berfungsi untuk sebagian besar hal
sumber
Coba ini...
sumber
Implementasi sederhana menampilkan sepotong teks setiap dua detik selama loop berjalan.
sumber
Coba ini
sumber