Fungsi ini di bawah ini tidak bekerja seperti yang saya inginkan untuk; menjadi seorang JS pemula aku tidak bisa mencari tahu mengapa.
Aku butuh itu untuk menunggu 5 detik sebelum memeriksa apakah newState
adalah -1
.
Saat ini, tidak menunggu, hanya cek langsung.
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
Anda harus menempatkan kode dalam fungsi callback anda pasokan untuk setTimeout
:
function stateChange(newState) {
setTimeout(function () {
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}, 5000);
}
Kode lainnya akan segera mengeksekusi.
Anda benar-benar tidak't melakukan hal ini, penggunaan yang benar dari timeout adalah alat yang tepat untuk OP's masalah dan kesempatan lain di mana anda hanya ingin menjalankan sesuatu setelah periode waktu. Joseph Silber telah menunjukkan bahwa baik dalam jawabannya. Namun, jika dalam beberapa non-produksi kasus anda benar-benar ingin untuk menggantung di thread utama untuk suatu periode waktu, hal ini akan melakukannya.
function wait(ms){
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
Dengan eksekusi dalam bentuk:
console.log('before');
wait(7000); //7 seconds in milliseconds
console.log('after');
I've tiba di sini karena saya sedang membangun sebuah tes sederhana untuk kasus sequencing campuran dari operasi asynchronous sekitar berjalan lama menghalangi operasi (yaitu mahal manipulasi DOM) dan ini adalah simulasi operasi pemblokiran. Hal ini sesuai dengan pekerjaan yang baik, jadi saya pikir saya posting untuk siapa pun yang tiba di sini, mirip dengan use case. Meski begitu, it's menciptakan Date() pada objek dalam sebuah while loop, yang mungkin sangat membanjiri GC jika itu berjalan cukup lama. Tapi aku bisa't cukup menekankan, ini hanya cocok untuk pengujian, untuk bangunan yang sebenarnya fungsi anda harus merujuk kepada Joseph Silber's jawaban.
Berikut ini's solusi menggunakan baru async/menunggu sintaks.
Pastikan untuk memeriksa dukungan browser karena ini adalah fitur baru yang diperkenalkan dengan ECMAScript 6.
Helper fungsi:
const delay = ms => new Promise(res => setTimeout(res, ms));
Penggunaan:
const yourFunction = async () => {
await delay(5000);
console.log("Waited 5s");
await delay(5000);
console.log("Waited an additional 5s");
};
Keuntungan dari pendekatan ini adalah bahwa hal itu membuat kode anda terlihat dan berperilaku seperti synchronous code.
Anda tidak harus hanya mencoba untuk jeda 5 detik dalam javascript. Itu doesn't bekerja dengan cara itu. Anda dapat menjadwalkan fungsi kode untuk menjalankan 5 detik dari sekarang, tetapi anda harus menempatkan kode yang ingin anda jalankan kemudian menjadi fungsi dan sisanya dari kode anda setelah fungsi itu akan terus berjalan segera.
Misalnya:
function stateChange(newState) {
setTimeout(function(){
if(newState == -1){alert('VIDEO HAS STOPPED');}
}, 5000);
}
Tapi, jika anda memiliki kode seperti ini:
stateChange(-1);
console.log("Hello");
The konsol.log()
pernyataan akan dijalankan segera. Itu tidak akan menunggu sampai setelah batas waktu kebakaran di stateChange()
fungsi. Anda tidak bisa hanya jeda eksekusi javascript untuk jumlah yang telah ditetapkan waktu.
Sebaliknya, setiap kode yang ingin anda jalankan penundaan harus berada di dalam setTimeout()
fungsi callback (atau disebut dari fungsi tersebut).
Jika anda tidak mencoba untuk "berhenti" dengan perulangan, maka anda'a pada dasarnya "hang" Javascript penerjemah untuk periode waktu. Karena Javascript menjalankan kode anda di hanya satu thread, bila anda're perulangan tidak ada lagi yang bisa menjalankan (tidak ada acara lain penangan bisa disebut). Jadi, perulangan menunggu beberapa variabel untuk perubahan tidak akan berhasil karena tidak ada kode yang bisa dijalankan untuk mengubah variabel tersebut.
Menggunakan fungsi delay seperti ini:
var delay = ( function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
Penggunaan:
delay(function(){
// do stuff
}, 5000 ); // end delay
Kredit pergi untuk pengguna CMS, lihat https://stackoverflow.com/q/1909441/1066234
Jika anda're dalam sebuah async function anda hanya dapat melakukannya dalam satu baris:
console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);
Pemberitahuan, jika target adalah NodeJS itu akan lebih efisien untuk menggunakan ini (itu's yang telah ditetapkan promisified setTimeout fungsi):
await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec
Cara terbaik untuk membuat fungsi yang sama untuk menunggu dalam mili detik, fungsi ini akan menunggu milidetik yang disediakan dalam argumen:
function waitSeconds(iMilliSeconds) {
var counter= 0
, start = new Date().getTime()
, end = 0;
while (counter < iMilliSeconds) {
end = new Date().getTime();
counter = end - start;
}
}
Berdasarkan Joseph Silber's jawaban, aku akan melakukannya seperti itu, sedikit lebih generik.
Anda akan memiliki fungsi anda (let's membuat satu didasarkan pada pertanyaan):
function videoStopped(newState){
if (newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
Dan anda bisa menunggu fungsi:
function wait(milliseconds, foo, arg){
setTimeout(function () {
foo(arg); // will be executed after the specified time
}, milliseconds);
}
Pada akhirnya anda akan memiliki:
wait(5000, videoStopped, newState);
Yang's solusi, saya lebih suka tidak menggunakan argumen dalam fungsi menunggu (hanya foo();
bukan foo(arg);
) tapi yang's misalnya.
Aku digunakan untuk menjalankan game PC dari tepi atau IE. Dan itu selfclose YAITU Tepi setelah 7 detik.
Firefox dan Google Chrome tidak bisa digunakan untuk memulai permainan dengan cara ini.
<html<body>
<a href="E:\game\game.exe" name="game" onmouseout="waitclose(7000);"> game
<img src="game.jpg" width="100%" height="97%" ></a>
<script>
function waitclose(ms){
var start = new Date().getTime();var end=start;
while(end < start + ms) {end = new Date().getTime();}
window.open('', '_self', ''); window.close();
}
</script>
</body></html>
Membuat fungsi Js baru
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
Memanggil fungsi ketika anda ingin menunda eksekusi. Menggunakan milidetik dalam int untuk menunda nilai.
####Some code
sleep(1000);
####Next line