哪种方式更方便在无限循环中执行异步函数,每次执行之间都休眠(Node.js / Vanilla JS)

Posted

技术标签:

【中文标题】哪种方式更方便在无限循环中执行异步函数,每次执行之间都休眠(Node.js / Vanilla JS)【英文标题】:Which way is more convenient execute an async function in endless loop with a sleep between each execution (Node.js / Vanilla JS) 【发布时间】:2019-07-22 13:24:19 【问题描述】:

我写了一些异步函数,它做了一些事情然后什么也不返回。 在函数结束执行后,我想等待几秒钟,然后再执行相同的例程。

流程是这样的: 1.执行功能 2.等到执行完成 3.等待/睡眠一段时间 4. 从第 1 步重新开始

函数执行的无限循环,休眠并重新开始。

现在我的问题是下面的 2 个代码块中哪个更适合使用:

选项 1:

const MEANING_OF_LIFE = 42;
const DELAY_IN_MILLISECONDS = 1000;


const whatsTheMeaningOfLife = async () => 
  console.log(MEANING_OF_LIFE);


const outter = fn => 

  inner = async fn => 
    await fn();
    setTimeout(() => outter(fn), DELAY_IN_MILLISECONDS);
  ;

  inner(fn);
;

(() => 
  outter(whatsTheMeaningOfLife);
)();

选项 2:

const MEANING_OF_LIFE = 42;
const DELAY_IN_MILLISECONDS = 1000;


const whatsTheMeaningOfLife = () => 
  console.log(MEANING_OF_LIFE);


const sleep = () => 
  return new Promise((resolve, ) => 
    setTimeout(() => resolve(), DELAY_IN_MILLISECONDS);
  );
;

(async () => 
  while(true) 
    await whatsTheMeaningOfLife();
    await sleep();
  
)();

【问题讨论】:

那个inner好像没必要,和outer一样。 【参考方案1】:

第二个版本看起来更短、更简洁、更易于理解,并且还允许您正确处理错误。但是,我建议将DELAY_IN_MILLISECONDS 作为参数传递给sleep,而不是使用全局常量。

【讨论】:

以上是关于哪种方式更方便在无限循环中执行异步函数,每次执行之间都休眠(Node.js / Vanilla JS)的主要内容,如果未能解决你的问题,请参考以下文章

爬虫第四章 单线程+多任务异步协程

异步编程之事件循环机制

爬虫-高性能异步爬虫

单线程+异步协程

理解闭包同步异步的最好例子

python第四周程序控制之循环,randow库,圆周率的计算