Apakah ada cara saya bisa tidur di JavaScript sebelum melakukan tindakan lain?
Contoh:
var a = 1+3;
// Sleep 3 seconds before the next action here
var b = a + 4;
javascript
sleep
Jin Yong
sumber
sumber
Jika Anda benar-benar membutuhkan
sleep()
hanya untuk menguji sesuatu. Namun ketahuilah bahwa itu akan membuat browser macet sebagian besar saat debuggin - mungkin karena itulah Anda tetap membutuhkannya. Dalam mode produksi, saya akan mengomentari fungsi ini.Jangan gunakan
new Date()
dalam loop, kecuali jika Anda ingin membuang-buang memori, kekuatan pemrosesan, baterai dan mungkin seumur hidup perangkat Anda.sumber
Versi ECMAScript 6, menggunakan generator dengan hasil untuk "pemblokiran kode":
Karena pertanyaan awal telah diposting tujuh tahun yang lalu, saya tidak repot-repot menjawab dengan kode yang tepat, karena terlalu mudah dan sudah dijawab. Ini akan membantu dalam masalah yang lebih rumit, seperti jika Anda memerlukan setidaknya dua tidur, atau jika Anda berencana untuk mengurutkan eksekusi yang tidak sinkron. Jangan ragu untuk memodifikasinya agar sesuai dengan kebutuhan Anda.
fungsi*
() => fungsi panah
Anda juga dapat mengaitkan acara melalui Janji :
Atau jauh lebih sederhana dan cara yang kurang mewah
Jika Anda hanya menunggu beberapa kondisi terjadi, Anda bisa menunggu seperti ini
sumber
Pembaruan 2018
Safari, Firefox, dan Node.js terbaru sekarang juga mendukung async / menunggu / janji.
Menggunakan async / menunggu / Janji:
(Mulai 1/2017, didukung di Chrome, tetapi tidak di Safari, Internet Explorer, Firefox, Node.js)
Pembaruan 2017
JavaScript telah berkembang sejak pertanyaan ini diajukan dan sekarang memiliki fungsi generator, dan async / await / Promise baru sedang diluncurkan.
Di bawah ini ada dua solusi, satu dengan fungsi generator yang akan bekerja pada semua browser modern, dan yang lainnya, menggunakan async / menunggu baru yang belum didukung di mana-mana.Menggunakan fungsi generator:
Perhatikan fakta bahwa kedua solusi ini asinkron. Ini berarti bahwa myAsyncFunc (dalam kedua kasus) akan kembali saat tidur.
Penting untuk dicatat bahwa pertanyaan ini berbeda dari Apa itu versi tidur JavaScript ()? di mana pemohon meminta tidur nyenyak (tidak ada eksekusi kode lain pada proses) daripada penundaan antara tindakan.
sumber
let co = gen => (...args) => { let iter = gen(...args); let resume = () => new Promise((resolve, reject) => { let result = iter.next(); if (result.done) resolve(result.value); else Promise.resolve(result.value).then(resume).then(resolve, reject); }); return resume(); };
akan membiarkan Andalet asyncAdd = co(function* (a, b) { console.log('Sleeping'); yield sleep(3000); console.log('Done'); return a + b; }); asyncAdd(3, 4).then(console.log);
menggunakan definisi darisleep()
blok kode kedua Anda.Jika Anda ingin fungsi yang kurang kikuk daripada
setTimeout
dansetInterval
, Anda bisa membungkusnya dalam fungsi yang hanya membalik urutan argumen dan memberi mereka nama yang bagus:Versi CoffeeScript:
Anda kemudian dapat menggunakannya dengan baik dengan fungsi anonim:
Sekarang terbaca dengan mudah sebagai "setelah N milidetik, ..." (atau "setiap N milidetik, ...")
sumber
Cara lain untuk melakukannya adalah dengan menggunakan Promise dan setTimeout (perhatikan bahwa Anda harus berada di dalam suatu fungsi dan atur sebagai asinkron dengan kata kunci async):
sumber
Berikut adalah cara yang sangat sederhana untuk melakukannya yang 'terasa' seperti tidur sinkron / jeda, tetapi adalah kode async yang sah.
sumber
Anda dapat menggunakan javascript biasa, ini akan memanggil fungsi / metode Anda setelah 5 detik:
sumber
Ada beberapa cara untuk mengatasi masalah ini. Jika kita menggunakan
setTimeout
fungsinya, mari kenali dulu. Fungsi ini memiliki tiga parameter:function
ataucode
,delay
(dalam milidetik) danparameters
. Karena parameter fungsi atau kode diperlukan, yang lain opsional. Setelah Anda tidak memasukkan penundaan , itu akan diatur ke nol.Untuk detail lebih lanjut tentang
setTimeout()
pergi ke tautan ini .Versi sederhana:
Menggunakan parameter pass:
Dukungan Browser:
sumber
Ini adalah model saya yang menunjukkan bagaimana "tidur" atau "DoEvents" dalam javascript menggunakan fungsi generator (ES6). Kode yang dikomentari:
sumber
Coba fungsi ini:
Inilah cara Anda menggunakannya:
Atau pergi gaya janji:
Ini demo .
sumber