我正在为个人需求开发一个控制台脚本。我需要能够暂停更长的时间,但是,根据我的研究,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不能识别这个。
我怎样才能实现这种延长的暂停?
Node 7.6.0或更高版本
节点支持本地等待:
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
然后如果你可以使用异步函数:
await sleep(10000); // sleep for 10 seconds
or:
sleep(10000).then(() => {
// This will execute 10 seconds from now
});
在较旧的Node版本上(原始答案)
我想要一个在Windows和Linux中工作的异步睡眠,而不会占用CPU很长的while循环。我尝试了睡眠包,但它无法安装在我的Windows盒子上。我最终使用:
https://www.npmjs.com/package/system-sleep
要安装它,输入:
npm install system-sleep
在你的代码中,
var sleep = require('system-sleep');
sleep(10*1000); // sleep for 10 seconds
效果非常好。
2021年1月更新:你甚至可以在Node REPL交互中使用——experimental-repl-await标志来实现
$ 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,您可以开箱即用。不需要提供命令行参数。即使谷歌Chrome今天也支持它。
2020年5月更新:
很快你就可以在async函数之外使用await语法了。在顶层,比如这个例子
await sleep(1000)
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
提案已进入第三阶段。
今天你可以通过webpack 5 (alpha)使用它,
更多信息:
Nodejs中的和谐标志:https://nodejs.org/en/docs/es6/
所有NodeJS版本下载:https://nodejs.org/en/download/releases/
如果你想“编码高尔夫”,你可以在这里制作一些其他答案的简短版本:
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
但在我看来,真正理想的答案是使用Node的util库和它的promisify函数,它正是为这类事情而设计的(为先前存在的基于承诺的东西制作基于承诺的版本):
const util = require('util');
const sleep = util.promisify(setTimeout);
在任何一种情况下,你都可以使用await调用你的睡眠函数来暂停:
await sleep(1000); // sleep for 1s/1000ms
编辑:正如评论中所指出的,你甚至可以把它减少到一行:
const sleep = require('util').promisify(setTimeout);
或者,如果你甚至不想费心创建一个睡眠函数:
await require('util').promisify(setTimeout)(1000);