创建连续执行的代码

Creating continuously executing code

我正在创建一个 parent-child 系统,Raspberry Pi 3 作为 parent,一系列 Arduino 作为 children。

parent 的主要活动是 reading/writing 通过 I2C 向 children 发送数据,托管网络服务器,storing/recalling 来自 Mongo 数据库的数据客户端,和 reading/writing 到 GPIO。

我正在寻找的是一种让我的 "main" 代码块永远存在的方法,类似于 Arduino 的 loop() 函数中的代码的工作方式。

我知道 while(true) 循环是 no-no,但我对使用 setTimeout 触发此重复执行持谨慎态度,因为我的代码的执行时间有很大差异,具体取决于 I2C 和数据库内容。

像 forever 或 PM2 这样的图书馆会在这里为我服务吗?

首先,forever and PM2 都是 CLI,旨在通过在需要时自动重启进程来保持进程处于活动状态。如果我理解正确的话,你想重复一段代码而不是一个过程,所以考虑到你使用了大量异步代码,这里有一个关于如何做到这一点的解决方案:

async function loop() {
  /*
    Do everything you want to do in one iteration inside this function
    and use the `await` keyword to wait for Promises to resolve. If you use
    libraries that don't support Promises yet, look for a wrapper that uses
    them (often called "xy-as-promised") or use `require('util').promisify()`.
  */
}

async function startLoop() {
  while(true) await loop()
}

startLoop()

@Niklas 使用新的 async/await 范例有一个有趣的方法。但是,如果你想坚持使用 "good" 老式的 JS(或者武装猴子强迫你使用它),下面的内容应该会让猴子满意:

function asyncStuff() {
    // if doStuff() returns a promise, just return it.  However, I'm assuming here that doStuff() uses a error-first callback common in NodeJS.
    return new Promise(function(resolve, reject) {
        doStuff(function errorFirstCallback(error) {
            if(error) {
                return reject(error);
            }

            resolve();
    });
};

function loop() {
    return asyncStuff().then(loop);
}

loop();

基本上,您使用 promises 创建了一个无限循环。 loop() 调用 asyncStuff() 并等待 promise 解决。在承诺解决后, loop() 再次被调用。无需使用 while 或 ES6.

此代码段的一个有趣方面是您不会因递归调用 loop() 而溢出堆栈。很酷吧?