Bagaimana Saya Bisa Menunggu Di Node.js (Javascript), saya perlu berhenti untuk jangka waktu tertentu

385

Saya sedang mengembangkan konsol seperti naskah untuk kebutuhan pribadi. Saya harus dapat berhenti untuk waktu yang lama, tetapi, dari penelitian saya, node.js tidak memiliki cara untuk berhenti seperti yang diperlukan. Semakin sulit membaca informasi pengguna setelah jangka waktu tertentu ... Saya telah melihat beberapa kode di luar sana, tetapi saya percaya mereka harus memiliki kode lain di dalamnya agar mereka dapat bekerja seperti:

setTimeout(function() {
}, 3000);

Namun, saya perlu segalanya setelah baris kode ini untuk dieksekusi setelah periode waktu.

Sebagai contoh,

//start-of-code
console.log('Welcome to My Console,');
some-wait-code-here-for-ten-seconds..........
console.log('Blah blah blah blah extra-blah');
//endcode. 

Saya juga pernah melihat hal-hal seperti

yield sleep(2000);

Tetapi node.js tidak mengenali ini.

Bagaimana saya bisa mencapai jeda yang diperpanjang ini?

Christopher Allen
sumber
3
bagaimana kabar Anda menandai salah satu dari orang-orang ini sebagai jawaban yang benar :)
Billybonks
1
@Christopher Allen, Mungkin tidak relevan, tetapi melakukan pekerjaan: require("child_process").execSync('php -r "sleep($argv[1]);" ' + seconds);
Haitham Sweilem
The simpul-tidur modul NPM mungkin melakukan trik (Namun, saya hanya akan menggunakannya untuk debugging)
Julian Soro

Jawaban:

211

Cara terbaik untuk melakukannya adalah dengan memecah kode Anda menjadi beberapa fungsi, seperti ini:

function function1() {
    // stuff you want to happen right away
    console.log('Welcome to My Console,');
}

function function2() {
    // all the stuff you want to happen after that pause
    console.log('Blah blah blah blah extra-blah');
}

// call the first chunk of code right away
function1();

// call the rest of the code and have it execute after 3 seconds
setTimeout(function2, 3000);

Ini mirip dengan solusi JohnnyHK , tetapi jauh lebih rapi dan lebih mudah diperluas.

Elliot Bonneville
sumber
7
@LucasSeveryn Anda salah, kalau begitu. Ini adalah pola desain inti.
Elliot Bonneville
Dan apa yang Anda lakukan ketika dimulainya fungsi tidak hanya satu fungsi jauhnya, tetapi 10 file dari kode yang harus di-deinkronisasi?
Cyril Duchon-Doris
10
@ CyrilDuchon-Doris Apa?
AturSams
3
gunakan jawaban @ machineghost untuk solusi berbasis janji yang elegan yang tidak memerlukan kode khusus dan dukungan menunggu / async
Dane Macaulay
Ini async, artinya jika function1 berakhir sebelum 3 detik, mereka mulai saling tumpang tindih. Maka Anda bahkan tidak bisa kembali dan itu hampir tidak pernah bisa digunakan. Satu-satunya cara yang saya temukan sejauh ini adalah menggunakandebugger;
Cristian Traìna
428

Jawaban baru untuk pertanyaan lama. Hari ini ( Jan 2017 Juni 2019) jauh lebih mudah. Anda dapat menggunakan sintaks baruasync/await . Sebagai contoh:

async function init() {
  console.log(1);
  await sleep(1000);
  console.log(2);
}

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}   

Untuk menggunakan di async/awaitluar kotak tanpa menginstal dan plugin, Anda harus menggunakan node-v7 atau node-v8, menggunakan --harmonyflag.

Pembaruan Juni 2019: Dengan menggunakan versi terbaru NodeJS Anda dapat menggunakannya di luar kotak. Tidak perlu memberikan argumen baris perintah. Bahkan Google Chrome mendukungnya hari ini.

Pembaruan Mei 2020: Anda akan segera dapat menggunakan awaitsintaks di luar fungsi async. Di tingkat atas seperti dalam contoh ini

await sleep(1000)
function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
} 

Proposal ada di tahap 3 . Anda dapat menggunakannya hari ini dengan menggunakan webpack 5 (alpha),

Info lebih lanjut:

Aminadav Glickshtein
sumber
5
Saya pikir Anda lupa awaitkata kunci di depansleep(1000)
Ryan Jarvis
6
Ini benar-benar harus menjadi jawabannya, paket sleep node.js bisa merepotkan.
Stuart Allen
4
Solusi terbaik memang
Kostas Siabanis
40
let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));Untuk orang aneh seperti saya :)
Predrag Stojadinović
21
let sleep = require('util').promisify(setTimeout);bekerja pada Node 7.6+ dan meningkatkan keterbacaan
BrianHVB
217

Solusi terpendek tanpa ketergantungan:

await new Promise(resolve => setTimeout(resolve, 5000));
k06a
sumber
14
"Puncak kecanggihan adalah kesederhanaan." - Clare Booth Luce. Sejauh ini, inilah jawaban terbaik, IMO.
arnold
3
Ini jelas jauh lebih baru daripada jawaban lain, tetapi yang paling elegan pada 2018 yang menyelesaikan pekerjaan dalam 1 baris tanpa dampak lain pada kode.
Herick
1
Ini bagus. Anda harus menggunakan NodeJS 7.6.0 atau lebih tinggi. Ini tidak akan berfungsi pada versi yang lebih lama.
Ryan Shillington
5
let sleep = require('util').promisify(setTimeout);tiga karakter lebih panjang tetapi dapat digunakan kembali dan lebih mudah dibaca
BrianHVB
2
Untuk menghindari keluhan eslint, sebut saja resolvebukan done. Yaituawait new Promise(resolve => setTimeout(resolve, 5000))
Darren Cook
150

Masukkan kode yang ingin Anda jalankan setelah penundaan dalam setTimeoutpanggilan balik:

console.log('Welcome to My Console,');
setTimeout(function() {
    console.log('Blah blah blah blah extra-blah');
}, 3000);
JohnnyHK
sumber
2
Ini sangat berantakan dan umumnya praktik buruk, terutama jika OP ingin sisa program berjalan setelah penundaan itu. Lihat jawaban saya.
Elliot Bonneville
32
@ElliotBonneville Ini hanya contoh untuk menggambarkan konsep. Jelas Anda bisa (harus) memasukkan kode ke dalam panggilan fungsi alih-alih menggunakan kode inline, seperti di tempat lain.
JohnnyHK
@ChristopherKemp: Ternyata Node.js memiliki solusi untuk ini node-fibers. Coba lihat.
Elliot Bonneville
Ini adalah solusi yang bagus, terutama jika Anda tidak ingin mengeksekusi kode apa pun, Anda hanya ingin meniru metode "sleep" di dalam sebuah loop. Tidak ada yang salah dengan contoh ini.
Halfstop
ini sangat cocok untuk menunda permintaan yang datang dari klien, saya menggunakan pendekatan ini untuk menguji pemintal pemuatan saya di sisi klien
moein rahimi
145

Ini adalah teknik pemblokiran sederhana:

var waitTill = new Date(new Date().getTime() + seconds * 1000);
while(waitTill > new Date()){}

Ini memblokir sejauh tidak ada hal lain yang akan terjadi dalam skrip Anda (seperti panggilan balik). Tetapi karena ini adalah skrip konsol, mungkin itu yang Anda butuhkan!

atlex2
sumber
27
mengerikan atau tidak, itu sederhana wait, itu menghalangi dan berfungsi untuk beberapa tujuan pengujian. Persis apa yang saya cari.
Clijsters
8
sempurna menjawab pertanyaan tanpa lib pihak ke-3, dan sederhana. Namun orang-orang mengatakan "mengerikan" .... Ini bagus misalnya untuk mensimulasikan beban CPU yang besar dll. Btw sangat mirip dengan phpied.com/sleep-in-javascript
Don Cheadle
2
Juga ini adalah pendekatan yang diperlukan jika Anda mencoba mensimulasikan sesuatu yang akan memperlambat loop acara, sehingga memperlambat pengguna / koneksi lain juga. Menambahkan panggilan balik yang tertunda tidak akan memengaruhi pengguna / koneksi lain.
Don Cheadle
13
Ini adalah spin-wait.
Mike Atlas
7
@ Ali yang tampaknya menjadi tujuannya.
Félix Gagnon-Grenier
63

Pada Node 7.6.0 atau lebih tinggi

Node mendukung menunggu secara asli:

const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));

maka jika Anda dapat menggunakan fungsi async:

await sleep(10000); // sleep for 10 seconds

atau:

sleep(10000).then(() => {
  // This will execute 10 seconds from now
});

Pada versi Node yang lebih lama (jawaban asli)

Saya ingin tidur asinkron yang bekerja di Windows & Linux, tanpa memonopoli CPU saya dengan loop yang lama. Saya mencoba paket tidur tetapi tidak mau menginstal di kotak Windows saya. Saya akhirnya menggunakan:

https://www.npmjs.com/package/system-sleep

Untuk menginstalnya, ketik:

npm install system-sleep

Dalam kode Anda,

var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds

Bekerja seperti pesona.

Ryan Shillington
sumber
1
jawaban yang bagus terima kasih - itu membuat beberapa kode tidak mungkin menjadi mungkin - ini BUKAN spin-tunggu
danday74
1
Pada penelitian lebih lanjut modul ini bergantung pada deasync yang bercabang dari repo github deasync lain. Repo asli memperingatkan untuk tidak menggunakannya karena ini adalah peretasan. Ini berfungsi tetapi tidak pada semua platform jadi jika Anda memerlukan solusi lintas platform hindari yang satu ini.
danday74
1
ya, saya tidak pernah mengalami masalah dengan itu dan itu bagus untuk dev - di bawah tenda saya percaya itu bergantung pada C atau C ++ yang tersedia secara luas tapi saya kira pada beberapa mesin tidak dan saat itulah gagal itulah sebabnya menyebabkan masalah - jika gagal, sistem sleep kembali ke putaran tunggu yang akan membekukan eksekusi kode
danday74
1
Paket ini tidak berfungsi pada Mac OS, dan karenanya tidak kompatibel lintas, dan karenanya tidak bisa diterapkan. Lihat github.com/jochemstoel/nodejs-system-sleep/issues/4
nuzzolilo
1
@Nuzzolilo Itu aneh. Kami memiliki satu pengembang di Mac OS dan dia tidak pernah menyebutkan sesuatu yang salah. Saya menduga itu adalah versi Mac OS tertentu. Saya juga memperbarui jawaban ini karena pada dasarnya tidur dibangun ke versi NodeJS yang lebih baru.
Ryan Shillington
62

Fungsi tidur sederhana dan elegan menggunakan Javascript modern

function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

Tidak ada ketergantungan, tidak ada panggilan balik neraka; itu dia :-)


Mempertimbangkan contoh yang diberikan dalam pertanyaan, ini adalah bagaimana kita akan tidur di antara dua log konsol:

async function main() {
    console.log("Foo");
    await sleep(2000);
    console.log("Bar");
}

main();

"Kelemahan" adalah bahwa fungsi utama Anda sekarang juga harus async. Tapi, mengingat Anda sudah menulis kode Javascript modern, Anda mungkin (atau setidaknya seharusnya!) Menggunakan async/ awaitseluruh kode Anda, jadi ini benar-benar bukan masalah. Semua browser modern saat ini mendukungnya .

Memberikan sedikit wawasan tentang sleepfungsi bagi mereka yang tidak terbiasa async/awaitdan operator panah gemuk, ini adalah cara tertulis untuk menuliskannya:

function sleep(millis) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () { resolve(); }, millis);
    });
}

Namun, menggunakan operator panah gemuk membuatnya lebih kecil (dan lebih elegan).

Lucio Paiva
sumber
1
Anda juga dapat menulis fungsi tidur tanpa asyncdan membiarkan yang lainnya tetap sama. Mungkin lebih jelas dengan itu async.
Kevin Peña
Tangkapan yang bagus, @ KevinPeña. Sebenarnya, saya pikir saya lebih suka tanpa itu async. Sunting jawaban saya dengan saran Anda. Saya tidak berpikir itu membuat kode lebih jelas; untuk itu, saya akan menggunakan JSDoc saja.
Lucio Paiva
8
Saya suka memiliki satu-liner berikut dalam skrip saya:const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
korya
46

Anda dapat menggunakan www.npmjs.com/package/sleep ini

var sleep = require('sleep');
sleep.sleep(10); // sleep for ten seconds
Aleksej
sumber
4
Ini berfungsi dengan baik MacOS, tetapi mengalami kesalahan CentOSkarena kesalahan node_gyp . Sepertinya tidak portabel.
AechoLiu
1
mungkin masalah yang disebabkan bukan oleh OS, tetapi oleh node build
Aleksej
34

Pertanyaan ini cukup lama, tetapi baru-baru ini V8 telah menambahkan Generator yang dapat memenuhi apa yang diminta OP. Generator umumnya paling mudah digunakan untuk interaksi async dengan bantuan perpustakaan seperti suspend atau gen-run .

Berikut ini contoh menggunakan penangguhan:

suspend(function* () {
    console.log('Welcome to My Console,');
    yield setTimeout(suspend.resume(), 10000); // 10 seconds pass..
    console.log('Blah blah blah blah extra-blah');
})();

Bacaan terkait (dengan cara mempromosikan diri yang tidak tahu malu): Apa Kesepakatan Besar dengan Generator? .

jmar777
sumber
2
Jawaban yang bagus - Tetapi harus dibacayield setTimeout(suspend.resume(), 10000);
edhubbell
1
Terima kasih, @edhubbell. Jawaban ini didasarkan pada versi penangguhan yang sangat lama, tetapi Anda benar tentang yang terbaru. Saya akan memperbarui jawabannya.
jmar777
untuk versi node apa ini?
danday74
1
@ danday74 Saya tidak dapat mengingat dengan tepat kapan mereka tidak ditandai, tetapi mereka sudah ada sejak v0.12 di belakang --harmonybendera, dan menurut node.green, mereka setidaknya tersedia tanpa bendera sejak v4.8.4: node.green/#ES2015-functions-generators-basic-functionality . Harap dicatat, bagaimanapun, bahwa async/awaitsintaks yang lebih baru menyediakan solusi yang lebih baik untuk ini sekarang, tanpa perlu perpustakaan tambahan seperti suspend. Lihat jawaban ini untuk contoh: stackoverflow.com/a/41957152/376789 . Fungsi Async tersedia (tanpa flag) sejak v7.10.
jmar777
20

Di Linux / nodejs ini berfungsi untuk saya:

const spawnSync = membutuhkan ('child_process'). spawnSync;

var sleep = spawnSync ('sleep', [1.5]);

Itu memblokir, tetapi itu bukan loop menunggu yang sibuk.

Waktu yang Anda tentukan adalah dalam detik tetapi bisa berupa pecahan. Saya tidak tahu apakah OS lain memiliki perintah serupa.

Bart Verheijen
sumber
sleepcukup banyak hadir dan berada di sekeliling sejak awal UNIX hari en.wikipedia.org/wiki/Sleep_%28Unix%29 . Hanya "tidak jarang" dari itu mungkin tidak ada adalah windows (namun di sana Anda dapat mencobachild_process.spawnSync('timeout', ['/T', '10'])
humanityANDpeace
17

Jika Anda ingin "golf kode", Anda dapat membuat versi pendek dari beberapa jawaban lain di sini:

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

Tapi sebenarnya jawaban ideal menurut saya adalah menggunakan utilperpustakaan Node dan promisifyfungsinya, yang dirancang untuk hal semacam ini (membuat versi berbasis janji dari hal-hal yang sebelumnya tidak berbasis janji):

const util = require('util');
const sleep = util.promisify(setTimeout);

Dalam kedua kasus tersebut, Anda dapat menjeda hanya dengan menggunakan awaituntuk memanggil sleepfungsi Anda :

await sleep(1000); // sleep for 1s/1000ms
machineghost
sumber
Sebenarnya, menggunakan util.promisify, tidak mungkin untuk menelepon tidur tanpa juga memberikan panggilan balik. nodejs.org/api/…
Howie
1
Anda melewatkan await. Ini semacam membuat panggilan balik, menjeda beberapa hal, dan kemudian me-restart kode ketika panggilan balik itu kembali. Callback kembali dengan nilai, tetapi kami tidak peduli dalam hal ini, jadi tidak ada apa-apa di sebelah kiri await.
machineghost
1
tuliskan dalam satu baris untuk memberikan kode golf;) const sleep = require ('util'). promisify (setTimeout);
Fabian
14

Saya baru-baru ini membuat abstraksi sederhana bernama wait.for untuk memanggil fungsi-fungsi async dalam mode sinkronisasi (berdasarkan pada node-fiber). Ada juga versi berdasarkan ES6 Generator yang akan datang.

https://github.com/luciotato/waitfor

Menggunakan wait.for , Anda dapat memanggil fungsi async nodejs standar apa saja, seolah-olah itu adalah fungsi sinkronisasi, tanpa memblokir loop peristiwa simpul.

Anda dapat kode secara berurutan saat Anda membutuhkannya, yaitu, (saya kira) sempurna untuk menyederhanakan skrip Anda untuk penggunaan pribadi.

menggunakan wait.for kode Anda akan:

require('waitfor')

..in a fiber..
//start-of-code
console.log('Welcome to My Console,');
wait.miliseconds(10*1000); //defined in waitfor/paralell-tests.js - DOES NOT BLOCK
console.log('Blah blah blah blah extra-blah');
//endcode. 

Fungsi async apa pun dapat dipanggil dalam mode Sinkronisasi . Lihat contohnya.

Lucio M. Tato
sumber
TypeError: Object #<Object> has no method 'miliseconds'
CaffeineAddiction
komentar mengatakan: "// didefinisikan dalam waitfor / paralell-tests.js" ambil dari file itu.
Lucio M. Tato
2
setelah saya mendapatkannya dari wait.for/paralell-tests.jssaya menemukan kesalahan lain yang berkaitan dengan properti yang tidak ditentukan dll. Jadi saya perlu menyalinnya juga. Mengapa Anda tidak mengatur kode sedemikian rupa sehingga ini tidak diperlukan?
user907860
Tunggu. Untuk dan solusi serat lainnya telah membuka dunia baru bagi saya! Saya akan memilih ini jutaan kali jika saya bisa. Meskipun sebagian besar komunitas node menentang serat, saya pikir mereka adalah tambahan yang fantastis dan pasti memiliki tempat mereka ketika datang ke neraka panggilan balik.
Levi Roberts
7

Karena, mesin javascript (v8) menjalankan kode berdasarkan urutan peristiwa dalam antrian-acara, Tidak ada batasan ketat bahwa javascript memicu eksekusi tepat setelah waktu yang ditentukan. Yaitu, ketika Anda menetapkan beberapa detik untuk mengeksekusi kode nanti, memicu kode murni berdasarkan urutan dalam antrian acara. Jadi memicu eksekusi kode mungkin membutuhkan waktu lebih dari waktu yang ditentukan.

Jadi Node.js mengikuti,

process.nextTick()

untuk menjalankan kode nanti, alih-alih setTimeout (). Sebagai contoh,

process.nextTick(function(){
    console.log("This will be printed later");
});
HILARUDEEN S ALLAUDEEN
sumber
2

Dengan dukungan ES6 Promise, kita dapat menggunakannya tanpa bantuan pihak ketiga.

const sleep = (seconds) => {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, (seconds * 1000));
    });
};

// We are not using `reject` anywhere, but it is good to
// stick to standard signature.

Kemudian gunakan seperti ini:

const waitThenDo(howLong, doWhat) => {
    return sleep(howLong).then(doWhat);
};

Perhatikan bahwa doWhatfungsi menjadi resolvepanggilan balik di dalamnew Promise(...) .

Perhatikan juga bahwa ini adalah tidur ASYNCHRONOUS. Itu tidak memblokir loop acara. Jika Anda perlu memblokir tidur, gunakan perpustakaan ini yang menyadari memblokir tidur dengan bantuan binding C ++. (Meskipun kebutuhan untuk memblokir tidur di Node seperti lingkungan async jarang terjadi.)

https://github.com/erikdubbelboer/node-sleep

treecoder
sumber
1
let co = require('co');
const sleep = ms => new Promise(res => setTimeout(res, ms));

co(function*() {
    console.log('Welcome to My Console,');
    yield sleep(3000);
    console.log('Blah blah blah blah extra-blah');
});

Kode di atas adalah efek samping dari penyelesaian masalah neraka panggilan balik asinkron Javascript. Ini juga alasan saya berpikir bahwa menjadikan Javascript bahasa yang berguna di backend. Sebenarnya ini adalah peningkatan paling menarik yang diperkenalkan ke Javascript modern menurut saya. Untuk sepenuhnya memahami cara kerjanya, bagaimana generator bekerja harus dipahami sepenuhnya. Kata functionkunci yang diikuti oleh *disebut fungsi generator dalam Javascript modern. Paket npm comenyediakan fungsi pelari untuk menjalankan generator.

Pada dasarnya fungsi generator menyediakan cara untuk menghentikan eksekusi fungsi dengan yieldkata kunci, pada saat yang sama, yielddalam fungsi generator memungkinkan untuk bertukar informasi antara di dalam generator dan pemanggil. Ini menyediakan mekanisme bagi pemanggil untuk mengekstrak data dari promisepanggilan asinkron dan untuk meneruskan data yang diselesaikan ke generator. Secara efektif, itu membuat panggilan tidak sinkron sinkron.

Qian Chen
sumber
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Donald Duck
Terima kasih @DonaldDuck. Kode dalam jawaban saya mungkin merupakan bagian paling menarik dari peningkatan Javascript. Saya sangat kagum bahwa beberapa orang super pintar berpikir tentang cara ini untuk menyelesaikan masalah neraka panggilan balik.
Qian Chen
1

Ini adalah modul rasa moment.js berdasarkan pendekatan pemblokiran kotor yang disarankan oleh @ atlex2 . Gunakan ini hanya untuk pengujian .

const moment = require('moment');

let sleep = (secondsToSleep = 1) => {
    let sleepUntill = moment().add(secondsToSleep, 'seconds');
    while(moment().isBefore(sleepUntill)) { /* block the process */ }
}

module.exports = sleep;
Boaz - Pasang kembali Monica
sumber
0

Jika Anda hanya perlu menangguhkan untuk tujuan pengujian, eksekusi utas Anda saat ini coba ini:

function longExecFunc(callback, count) {

    for (var j = 0; j < count; j++) {
        for (var i = 1; i < (1 << 30); i++) {
            var q = Math.sqrt(1 << 30);
        }
    }
    callback();
}
longExecFunc(() => { console.log('done!')}, 5); //5, 6 ... whatever. Higher -- longer
Ivan Talalaev
sumber
0

sederhana kita akan menunggu 5 detik untuk beberapa peristiwa terjadi (yang akan ditunjukkan oleh variabel yang disetel ke true di tempat lain dalam kode) atau ketika batas waktu habis bahwa kita akan memeriksa setiap 100 ms

    var timeout=5000; //will wait for 5 seconds or untildone
    var scope = this; //bind this to scope variable
    (function() {
        if (timeout<=0 || scope.done) //timeout expired or done
        {
            scope.callback();//some function to call after we are done
        }
        else
        {
            setTimeout(arguments.callee,100) //call itself again until done
            timeout -= 100;
        }
    })();
Stan Sokolov
sumber
0

Bagi sebagian orang, jawaban yang diterima tidak berfungsi, saya menemukan jawaban yang lain dan ini berfungsi untuk saya: Bagaimana saya bisa meneruskan parameter ke callback setTimeout ()?

var hello = "Hello World";
setTimeout(alert, 1000, hello); 

'halo' adalah parameter yang dilewati, Anda dapat melewati semua parameter setelah batas waktu. Terima kasih kepada @Fabio Phms untuk jawabannya.

Dazt
sumber
0

Daripada melakukan semua setTimeout ini, tidur dan banyak hal lainnya, lebih baik digunakan

const delay = require('delay');
await delay(2000); // will wait for 2 seconds before executing next line of code
Rishab
sumber
Bisakah Anda menjelaskan apa itu 'keterlambatan', dan tautan ke dokumennya? Mengapa ini lebih baik?
boycy
-2

Jawaban lainnya bagus, tetapi saya pikir saya akan mengambil kebijaksanaan yang berbeda.

Jika yang benar-benar Anda cari adalah memperlambat file tertentu di linux:

 rm slowfile; mkfifo slowfile; perl -e 'select STDOUT; $| = 1; while(<>) {print $_; sleep(1) if (($ii++ % 5) == 0); }' myfile > slowfile  &

node myprog slowfile

Ini akan tidur 1 detik setiap lima baris. Program simpul akan berjalan lambat seperti penulis. Jika melakukan hal lain, mereka akan melanjutkan dengan kecepatan normal.

Mkfifo menciptakan pipa pertama-masuk-pertama-keluar. Inilah yang membuat ini bekerja. Baris perl akan menulis secepat yang Anda inginkan. $ | = 1 mengatakan jangan buffer output.

Pete
sumber
-3

Saya mengumpulkan, setelah membaca jawaban dalam pertanyaan ini, fungsi sederhana yang juga dapat melakukan panggilan balik, jika Anda membutuhkannya:

function waitFor(ms, cb) {
  var waitTill = new Date(new Date().getTime() + ms);
  while(waitTill > new Date()){};
  if (cb) {
    cb()
  } else {
   return true
  }
}
Netsi1964
sumber
-4

Untuk info lebih lanjut

yield sleep(2000); 

Anda harus memeriksa Redux-Saga . Tapi itu khusus untuk pilihan Anda Redux sebagai kerangka kerja model Anda (meskipun sangat tidak perlu).

Arseni Buinitski
sumber