我正在寻找一种在N秒后在nodejs中运行一些代码的方法。
尝试了setTimeout(),但它似乎完全阻止它,直到时间结束但这不是我想要的,因为我的服务器仍在发送和接收事件。
有什么建议吗?
答案 0 :(得分:17)
实际上,setTimeout
是异步的,所以它不会阻止。
setTimeout(function(){
// this code will only run when time has ellapsed
}, n * 1000);
// this code will not block, and will only run at the time
答案 1 :(得分:1)
实际上,setTimeout()完全可以满足您的要求,它不会阻塞,并且会在将来的某个时间执行给定的功能。
但是,要了解Node.js中发生的事情可能很棘手。我强烈建议您投资学习如何使用Promise API。刚开始时可能会造成混乱,但是会为您提供一个非常灵活的结构来控制异步事件。这是我在学习如何使用Promise API时编写的一个示例。您将看到它实际上使用了setTimeout(),但将其嵌入到Promise中。希望这段代码可以自我解释,可以帮助您实现所需的目标。
/*
* Try out javascript Promise code in Node.js
*
*/
"use strict";
function getRandomBoolean() {
return Math.random() > 0.5;
}
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
for (let i = 0; i < 5; i++) {
// Create a promise, which will randomly succeed (and call resolve) or
// fail (and call reject) after a random time interval
let intervalMS = getRandomInt(5000);
let promise = new Promise(function (resolve, reject) {
setTimeout(() => {
if (getRandomBoolean()) {
// Success - Call resolver function
resolve(i+" Hooray!");
} else {
// Treat this as an error - Call reject function
reject(i+" Sorry!");
}
}, intervalMS);
});
// When the promise is complete, show the results
promise.then(
// The first function is the resolve function, to be called
// with a result param upon successful completion of async task
result => console.log("Success: "+result),
// Next is reject function, to be called with an error parameter when something failed
error => console.log("Failure: "+error)
);
// Flow of execution falls through to here without blocking
console.log ("Created promise "+i+", will complete in "+intervalMS+" ms");
}
如果您在Node.js中运行以上示例(或者实际上它也应该在浏览器中运行,我只是未在其中进行测试),您将看到类似以下内容的输出:
Created promise 0, will complete in 853 ms
Created promise 1, will complete in 2388 ms
Created promise 2, will complete in 2738 ms
Created promise 3, will complete in 3053 ms
Created promise 4, will complete in 652 ms
Success: 4 Hooray!
Failure: 0 Sorry!
Failure: 1 Sorry!
Success: 2 Hooray!
Success: 3 Hooray!
请注意,“创建的承诺...”输出首先输出 ,向您显示执行成功而没有阻塞。