589

個人的なニーズに合わせてコンソール スクリプトを開発しています。長時間一時停止できるようにする必要がありますが、私の調査によると、Node.js には必要に応じて停止する方法がありません。しばらくすると、ユーザーの情報を読み取るのが難しくなります...いくつかのコードを見てきましたが、それらが機能するには、次のようなコードが内部に含まれている必要があると思います。

    setTimeout(function() {
    }, 3000);

ただし、一定期間後に実行するには、このコード行の後のすべてが必要です。

例えば、

    // start of code
    console.log('Welcome to my console,');

    some-wait-code-here-for-ten-seconds...

    console.log('Blah blah blah blah extra-blah');
    // end of code

私はまた、のようなものを見てきました

    yield sleep(2000);

しかし、Node.js はこれを認識しません。

この延長された一時停止を実現するにはどうすればよいですか?

4

25 に答える 25

756

2021 年 1 月更新--experimental-repl-await:フラグを使用してノード REPL インタラクティブで実行することもできます

$ node --experimental-repl-await
> const delay = ms => new Promise(resolve => setTimeout(resolve, ms))
> await delay(1000) /// waiting 1 second.

古い質問に対する新しい回答。今日 ( 2017 年 1月 2019 年 6 月) は、はるかに簡単です。新しいasync/await構文を使用できます。例えば:

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

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

プラグインをインストールせずにすぐに使用するには、フラグasync/awaitを使用して node-v7 または node-v8 を使用する必要があります。--harmony

2019 年 6 月の更新: NodeJS の最新バージョンを使用することで、すぐに使用できます。コマンド ライン引数を指定する必要はありません。現在、Google Chrome でさえサポートしています。

2020 年 5 月の更新:await間もなく、非同期関数の外部で構文 を使用できるようになります。この例のようにトップレベルで

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

提案はステージ 3です。webpack 5 (alpha) を使用することで、すぐに使用できます。

より詳しい情報:

于 2017-01-31T12:05:14.897 に答える
249

これを行う最善の方法は、次のように、コードを複数の関数に分割することです。

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);

これはJohnnyHKのソリューションに似ていますが、より洗練されていて拡張が容易です。

于 2013-01-10T01:46:21.703 に答える
183

これは単純なブロック手法です。

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

スクリプトで他に何も起こらない限り (コールバックなど)、ブロックしています。しかし、これはコンソール スクリプトなので、必要なものである可能性があります。

于 2016-06-01T17:51:08.363 に答える
159

遅延後に実行するコードをsetTimeoutコールバック内に配置します。

console.log('Welcome to My Console,');
setTimeout(function() {
    console.log('Blah blah blah blah extra-blah');
}, 3000);
于 2013-01-10T01:44:53.520 に答える
52

これを使用できますwww.npmjs.com/package/sleep

var sleep = require('sleep');
sleep.sleep(10); // sleep for ten seconds
于 2016-04-22T17:40:54.683 に答える
8

JavaScript エンジン (v8) は、イベント キュー内の一連のイベントに基づいてコードを実行するため、指定された時間後に JavaScript が正確に実行をトリガーするという厳密な規則はありません。つまり、後でコードを実行するために数秒を設定すると、コードのトリガーは、イベント キュー内のシーケンスに完全に基づいています。そのため、コードの実行のトリガーには、指定された時間よりも時間がかかる場合があります。

したがって、Node.js は次のようになります。

process.nextTick()

setTimeout() の代わりに後でコードを実行するには 例えば、

process.nextTick(function(){
    console.log("This will be printed later");
});
于 2013-01-10T11:22:37.633 に答える
-2

テスト目的で一時停止する必要がある場合は、現在のスレッドの実行を次のように試してください。

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
于 2016-11-29T09:19:15.423 に答える
-4

この質問の回答を読んだ後、必要に応じてコールバックも実行できる単純な関数をまとめました。

function waitFor(ms, cb) {
  var waitTill = new Date(new Date().getTime() + ms);
  while(waitTill > new Date()){};
  if (cb) {
    cb()
  } else {
   return true
  }
}
于 2016-11-06T08:08:38.153 に答える