簡體   English   中英

睡在 Node.js

[英]Sleep in Node.js

假設沒有“本地”方式來實現這一點,我的解決方案是

sleep = function(time) {
        var stop = new Date().getTime();
        while(new Date().getTime() < stop + time) {
            ;
        }
        return new Promise((r,_)=> r())
      }

所以做sleep(1000*3).then(()=>console.log("awake"))它會睡 3 秒然后解析Promise

(請注意,它會凍結此頁面一秒鍾。)

 sleep = function(time) { var stop = new Date().getTime(); while (new Date().getTime() < stop + time) {; } return new Promise((r, _) => r()) } console.log("sleeping...") sleep(1000 * 1).then(() => console.log("awake"))

假設這將在主線程中運行,它將凍結主進程,以便執行

sleep(1000*1).then(()=>console.log("awake")); console.log("Hello")

它將產生 output

VM2628:1 Hello
VM2628:1 awake

在睡眠的最后。 當然在做

setTimeout(()=>sleep(1000*3).then(()=>console.log("awake")),1000);console.log("Hello")
VM2815:1 Hello
undefined
VM2815:1 awake

將使它異步,但它不能滿足我的需要(讓我的主要進程進入sleep )。 有什么更好的辦法嗎?

[更新]承諾版本

/**
 * Sleep for time [msec]
 * @param time int milliseconds
 * @return Promise delayed resolve
 * @usage
    sleep(1000*3).then(()=>console.log("awake"))
 */
sleepP: function (time) {
  return new Promise((resolve, reject) => {
    var stop = new Date().getTime();
    while (new Date().getTime() < stop + time) {
      ;
    }
    return resolve(true)
  });
}

可以這樣稱呼

await sleepP( 1000 * 3 );

根本沒有必要凍結。 由於 javascripts 的異步性,我們可以將部分代碼保留一段時間,稍后再繼續。 首先我們需要一個有前途的計時器:

 const timer = ms => new Promise( res => setTimeout(res, ms));

然后我們可以簡單地使用它:

console.log("wait 3 seconds")
timer(3000).then(_=>console.log("done"));

或者用一點語法糖:

(async function(){
  console.log("wait 3 seconds");
  await timer(3000);
  console.log("done");
})()

如果你真的想凍結(非常糟糕),你根本不需要承諾:

function freeze(time) {
    const stop = new Date().getTime() + time;
    while(new Date().getTime() < stop);       
}

console.log("freeze 3s");
freeze(3000);
console.log("done");
function sleep(time, func){
    if (typeof func === 'function'){
        const timer = ms => new Promise( res => setTimeout(res, ms));
        timer(time).then(i=>func());
    }
    else{
        console.log('What about the function bro?')
    }
}
sleep(1000, function(){
    console.log('hello')
    console.log('test')
    var arr = [1,2,3,4]
    arr.forEach(i => console.log(i))
})

從 Node v15.0.0 開始,有一種使用Timers Promises API的新睡眠方式。

import {setTimeout} from 'timers/promises';

const bucket = ['a', 'b', 'c'];

for(const item of bucket) {
    await getItem(item);
    await setTimeout(100);
}

如果您還想使用常規的setTimeout計時器,您可以給 promise 計時器起別名。

import {setTimeout as sleep} from 'timers/promises';

我有一個問題,我正在使用異步寫入上傳到遠程數據庫並且速度太快,並且我遇到了速率限制器。

所以我實際上需要在代碼段之間暫停。

我的應用程序不在瀏覽器或服務器中,它只是一個命令行實用程序,所以我不擔心阻塞主執行線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM