创建连续执行的代码

时间:2017-10-30 17:39:21

标签: javascript raspberry-pi repeat

我正在创建一个父子系统,其中Raspberry Pi 3作为父级,一系列Arduinos作为孩子。

父母的主要活动是通过I2C读取/写入数据,托管网络服务器,存储/调用Mongo DB客户端的数据,以及读取/写入GPIO。

我正在寻找的是一种永久拥有“主要”代码块的方法,类似于Arduino的loop()函数中的代码如何工作。

我知道while(true)循环是禁止的,但我担心使用setTimeout来触发重复执行,因为我的代码执行时间差别很大,具体取决于I2C和数据库的内容。

永远的图书馆或PM2会在这里为我服务吗?

2 个答案:

答案 0 :(得分:1)

首先,foreverPM2都是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()

答案 1 :(得分:1)

@Niklas使用新的async / await范例有一个有趣的方法。但是,如果你想坚持“好”旧时尚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()并等待解决的承诺。承诺解决后,再次调用loop()。无需使用while或ES6。

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