Fungsi di bawah ini tidak berfungsi seperti yang saya inginkan; menjadi pemula JS saya tidak tahu mengapa.
Saya perlu menunggu 5 detik sebelum memeriksa apakah newState
is -1
.
Saat ini, tidak menunggu, hanya memeriksa langsung.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
javascript
dom-events
copyflake
sumber
sumber
Jawaban:
Anda harus memasukkan kode Anda dalam fungsi panggilan balik yang Anda berikan ke
setTimeout
:Kode lain akan segera dieksekusi.
sumber
Anda benar-benar tidak boleh melakukan ini , penggunaan batas waktu yang tepat adalah alat yang tepat untuk masalah OP dan setiap kesempatan lain di mana Anda hanya ingin menjalankan sesuatu setelah jangka waktu tertentu. Joseph Silber telah menunjukkan hal itu dengan baik dalam jawabannya. Namun, jika dalam beberapa kasus non-produksi Anda benar - benar ingin menggantung utas utama untuk jangka waktu tertentu, ini akan berhasil.
Dengan eksekusi dalam bentuk:
Saya telah tiba di sini karena saya sedang membangun test case sederhana untuk mengurutkan campuran operasi asinkron di sekitar operasi pemblokiran yang berjalan lama (yaitu manipulasi DOM yang mahal) dan ini adalah operasi pemblokiran yang disimulasikan. Ini cocok dengan pekerjaan itu, jadi saya pikir saya mempostingnya untuk orang lain yang datang ke sini dengan menggunakan case yang serupa. Meski begitu, itu membuat objek Date () dalam loop sementara, yang mungkin sangat membebani GC jika berjalan cukup lama. Tapi saya tidak bisa cukup menekankan, ini hanya cocok untuk pengujian, untuk membangun fungsionalitas aktual yang Anda harus merujuk pada jawaban Joseph Silber.
sumber
Inilah solusi menggunakan sintaks async / await baru .
Pastikan untuk memeriksa dukungan browser karena ini adalah fitur baru yang diperkenalkan dengan ECMAScript 6.
Fungsi utilitas:
Pemakaian:
Keuntungan dari pendekatan ini adalah membuat kode Anda terlihat dan berperilaku seperti kode sinkron.
sumber
Gunakan fungsi penundaan seperti ini:
Pemakaian:
Kredit: Bagaimana cara menunda penangan .keyup () sampai pengguna berhenti mengetik?
sumber
Anda seharusnya tidak hanya mencoba menjeda 5 detik dalam javascript. Tidak berfungsi seperti itu. Anda dapat menjadwalkan fungsi kode untuk menjalankan 5 detik dari sekarang, tetapi Anda harus memasukkan kode yang ingin Anda jalankan nanti ke dalam suatu fungsi dan sisa kode Anda setelah fungsi itu akan terus berjalan segera.
Sebagai contoh:
Tetapi, jika Anda memiliki kode seperti ini:
The
console.log()
pernyataan akan segera berjalan. Ini tidak akan menunggu sampai setelah batas waktu menyala dalamstateChange()
fungsi. Anda tidak bisa hanya menghentikan sementara eksekusi javascript untuk jumlah waktu yang telah ditentukan.Sebaliknya, kode apa pun yang Anda ingin tunda harus berada di dalam
setTimeout()
fungsi panggilan balik (atau dipanggil dari fungsi itu).Jika Anda memang mencoba "berhenti" dengan mengulang, maka Anda pada dasarnya akan "menggantung" penerjemah Javascript untuk jangka waktu tertentu. Karena Javascript menjalankan kode Anda hanya dalam satu utas, ketika Anda mengulang, tidak ada lagi yang dapat dijalankan (tidak ada penangan acara lainnya yang dapat dipanggil). Jadi, pengulangan menunggu beberapa variabel untuk berubah tidak akan berfungsi karena tidak ada kode lain yang dapat dijalankan untuk mengubah variabel itu.
sumber
var t = new Date().getTime(); while (new Date().getTime() < t + millisecondsToLockupBrowser);
Jika Anda berada dalam fungsi async, Anda cukup melakukannya dalam satu baris:
Perhatikan , jika target adalah NodeJS akan lebih efisien untuk menggunakan ini (ini adalah fungsi setTimeout yang telah ditentukan sebelumnya):
sumber
Coba ini:
sumber
Cara terbaik untuk membuat fungsi seperti ini untuk menunggu dalam mili detik, fungsi ini akan menunggu selama milidetik yang disediakan dalam argumen:
sumber
Berdasarkan jawaban Joseph Silber , saya akan melakukannya seperti itu, sedikit lebih generik.
Anda akan memiliki fungsi Anda (mari kita buat berdasarkan pertanyaan):
Dan Anda bisa memiliki fungsi menunggu:
Pada akhirnya Anda akan memiliki:
Itu solusinya, saya lebih suka tidak menggunakan argumen dalam fungsi menunggu (hanya untuk memiliki
foo();
bukanfoo(arg);
) tapi itu misalnya.sumber
Solusi ini berasal dari dokumentasi React Native untuk kontrol penyegaran :
Untuk menerapkan ini pada pertanyaan OP, Anda dapat menggunakan fungsi ini dalam koordinasi dengan
await
:sumber
Anda dapat menambahkan penundaan dengan membuat perubahan kecil pada fungsi Anda (async dan menunggu).
sumber
menggunakan angularjs:
sumber
Buat fungsi Js baru
Panggil fungsi ketika Anda ingin menunda eksekusi. Gunakan milidetik di int untuk nilai penundaan.
sumber
Saya menggunakannya untuk menjalankan game PC dari edge atau IE. Dan itu menutup IE Edge setelah 7 detik.
Firefox dan Google Chrome tidak dapat digunakan untuk memulai permainan dengan cara ini.
sumber