Javascript NodeJS定时器异步,不停止代码,也不使用setInterval

Javascript NodeJS定时器异步,不停止代码,也不使用setInterval,javascript,node.js,Javascript,Node.js,我想在NodeJS中调用一个函数,该函数检查日期。现在,如果标志设置为true,则连续检查 我不能使用setInterval,因为它太不准确了 我的函数工作正常,但我希望在不阻塞整个代码的情况下调用该函数,因此我认为异步方法可以完成这项工作,但事实并非如此: var bufferLogRunning=true; 变量dn_计数器; var masterbuffer_cache_log=[]; 异步函数f(){ 让承诺=新承诺((解决、拒绝)=>{ console.log('调用函数') var

我想在NodeJS中调用一个函数,该函数检查
日期。现在,如果标志设置为true,则连续检查

我不能使用
setInterval
,因为它太不准确了

我的函数工作正常,但我希望在不阻塞整个代码的情况下调用该函数,因此我认为异步方法可以完成这项工作,但事实并非如此:

var bufferLogRunning=true;
变量dn_计数器;
var masterbuffer_cache_log=[];
异步函数f(){
让承诺=新承诺((解决、拒绝)=>{
console.log('调用函数')
var start=Date.now();
while(bufferLogRunning==true){
如果(dn_计数器!=日期.现在()-start&&dn_计数器!=未定义){
masterbuffer\u cache\u log.push({
“毫”:dn_计数器,
“缓冲区”:“主缓冲区\缓存”
})
}
dn_counter=Date.now()-开始
如果(Date.now()-start>=4000){
bufferLogRunning=false;
}
}
console.log('DONE')
解决(“完成!”)
});
让结果=等待承诺;
}
console.log('FIRST')
f();

console.log('SECOND')
异步
函数不会神奇地将代码转换为不阻塞的内容。与
Promise
s一起工作只是语法上的糖分

你能做的就是使用

计划在I/O事件回调后“立即”执行回调

并将其包装成一个承诺:

function pause() {
   return new Promise((resolve, reject) => {
      setImmediate(resolve)
   })
}
while
循环中调用该函数,并使用
wait
中断
while
循环的执行,直到
pause
返回的承诺得到解决

在代码中使用
新承诺((解决,拒绝)
没有任何意义

var bufferLogRunning = true;
var dn_counter;
var masterbuffer_cache_log = [];

async function f() {

  console.log('FUNCION CALLED')
  var start = Date.now();
  while (bufferLogRunning == true) {

    await pause(); // interrupt the execution to let I/O events happen 

    if (dn_counter != Date.now() - start && dn_counter != undefined) {
      masterbuffer_cache_log.push({
        "millis": dn_counter,
        "buffer": "masterbuffer_cache"
      })
    }
    
    dn_counter = Date.now() - start
    if (Date.now() - start >= 4000) {
      bufferLogRunning = false;
    }
  }
  console.log('DONE')

  let result = "done!"
}

console.log('FIRST')
f();
console.log('SECOND')

如果
setImmediate
在您的用例中不起作用,您可以将其替换为
setTimeout
这是我程序中的代码,带有内联注释。请查看

//你的应用程序
常量应用={
//
//循环
//
循环:(cb,超时=1e3,时间=false)=>{
const start=Date.now();
设i=0;
//设置延迟法
常数延迟=毫秒=>{
i++;
//检查是否启用停止,然后立即返回
如果(delay.stopTrigger | | times&&i>times)返回true;
//运行函数
const now=Date.now();
const diff=now-start-i*超时;
//运行回调
cb(现在);
//设置新超时
设置超时(()=>{
//补偿差异
//我们将补偿延误
//让它更准确
延迟(超时差);
},ms);
};
//设置停止方法
delay.stopTrigger=false;
delay.stop=()=>delay.stopTrigger=true;
//带超时的运行周期
设置超时(延迟、超时、超时);
//返回延迟对象
返回延迟;
},
//
//同步超时功能
//
超时:ms=>newpromise(resolve=>setTimeout(resolve,ms)),
//
// !!!
//
//你的逻辑
//
init:async()=>{
//开始500毫秒的循环任务
//第一个参数是你的函数,
//秒(可选/1000ms)-以毫秒为单位的延迟量,
//第三(可选/无限)-循环数
const task=APP.cycle(现在=>{
//让我们在循环中打印一些东西
log(`Cycle task${now}`);
}, 500);
//现在任务持有stop方法,所以我们
//可以从这个范围内停止我们的循环
//但现在让我们做一些同步工作
//睡3秒钟
等待应用程序超时(3000);
//打印一些东西
log(`Hello from caller!`);
//睡3秒钟
等待应用程序超时(3000);
//打印一些东西并停止循环
log(`Hello from caller reach and stop cycle now!`);
task.stop();
//睡3秒钟
等待应用程序超时(3000);
//在末尾打印一些东西
log(`Hello from caller!所有工作已完成,立即退出;)`);
}
};
//运行应用程序

APP.init()
我不能使用setInterval,因为它太不准确了即使你使用的时间间隔小于你实际想要使用的时间间隔?这很有魅力!非常感谢你,我感谢你的解释。