我正在为个人需求开发一个控制台脚本。我需要能够暂停更长的时间,但是,根据我的研究,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不能识别这个。
我怎样才能实现这种延长的暂停?
function doThen(conditional,then,timer) {
var timer = timer || 1;
var interval = setInterval(function(){
if(conditional()) {
clearInterval(interval);
then();
}
}, timer);
}
使用示例:
var counter = 1;
doThen(
function() {
counter++;
return counter == 1000;
},
function() {
console.log("Counter hit 1000"); // 1000 repeats later
}
)
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
效果非常好。
使用现代Javascript的简单而优雅的睡眠函数
function sleep(millis) {
return new Promise(resolve => setTimeout(resolve, millis));
}
没有依赖,没有回调;就是这样:-)
考虑到问题中给出的例子,这是我们在两个控制台日志之间睡眠的方式:
async function main() {
console.log("Foo");
await sleep(2000);
console.log("Bar");
}
main();
“缺点”是你的主函数现在也必须是异步的。但是,考虑到您已经在编写现代Javascript代码,您可能(或者至少应该!)在所有代码中使用async/await,所以这真的不是一个问题。现在所有的浏览器都支持它。
对于那些不习惯async/await和胖箭头操作符的人,稍微深入了解一下sleep函数,下面是详细的书写方式:
function sleep(millis) {
return new Promise(function (resolve, reject) {
setTimeout(function () { resolve(); }, millis);
});
}
但是,使用胖箭头操作符会使它更小(也更优雅)。