使用nodejs在一定时间后运行函数/代码

问题描述 投票:13回答:2

我正在寻找一种在N秒后在nodejs中运行一些代码的方法。

尝试了setTimeout(),但它似乎完全阻止它,直到时间结束但这不是我想要的,因为我的服务器仍在发送和接收事件。

有什么建议?

javascript node.js timer delay settimeout
2个回答
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

2
投票

实际上,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!

请注意,“Created promise ...”输出首先出现,向您显示执行没有阻塞。

© www.soinside.com 2019 - 2024. All rights reserved.