我正在为个人需求开发一个控制台脚本。我需要能够暂停更长的时间,但是,根据我的研究,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不能识别这个。
我怎样才能实现这种延长的暂停?
如果你想“编码高尔夫”,你可以在这里制作一些其他答案的简短版本:
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);
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');
});
This code above is the side effect of the solving Javascript's asynchronous callback hell problem. This is also the reason I think that makes Javascript a useful language in the backend. Actually this is the most exciting improvement introduced to modern Javascript in my opinion. To fully understand how it works, how generator works needs to be fully understood. The function keyword followed by a * is called a generator function in modern Javascript. The npm package co provided a runner function to run a generator.
本质上,生成器函数提供了一种使用yield关键字暂停函数执行的方法,同时,生成器函数中的yield使生成器内部和调用者之间交换信息成为可能。这为调用方提供了一种机制,可以从异步调用的promise中提取数据,并将已解析的数据传递回生成器。实际上,它使异步调用同步化。