Javascript 创建连续执行的代码

Javascript 创建连续执行的代码,javascript,raspberry-pi,repeat,Javascript,Raspberry Pi,Repeat,我正在创建一个亲子系统,以树莓皮3为父系统,以一系列Arduinos为子系统 父级的主要活动是通过I2C向子级读取/写入数据、托管Web服务器、存储/调用Mongo DB客户端的数据以及向GPIO读取/写入数据 我要寻找的是一种永久保留“主”代码块的方法,类似于Arduino的loop()函数中的代码的工作方式 我知道while(true)循环是否定的,但我担心使用setTimeout触发重复执行,因为我的代码的执行时间因I2C和数据库内容的不同而有很大差异 像forever或PM2这样的库在这

我正在创建一个亲子系统,以树莓皮3为父系统,以一系列Arduinos为子系统

父级的主要活动是通过I2C向子级读取/写入数据、托管Web服务器、存储/调用Mongo DB客户端的数据以及向GPIO读取/写入数据

我要寻找的是一种永久保留“主”代码块的方法,类似于Arduino的loop()函数中的代码的工作方式

我知道while(true)循环是否定的,但我担心使用setTimeout触发重复执行,因为我的代码的执行时间因I2C和数据库内容的不同而有很大差异

像forever或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
范式提供了一种有趣的方法。然而,如果你想坚持使用“好”的老式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();
基本上,您可以使用承诺创建一个无限循环
loop()
调用
asyncStuff()
并等待承诺得到解决。承诺解析后,将再次调用
loop()
。无需使用
while
或ES6


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

如果你的代码是纯同步的,我想不出你不应该使用
而(true)
的原因。您必须考虑什么是导入:您是想确保迭代在下一个迭代开始之前完成,还是要在特定的时间间隔内运行代码?不幸的是,这就是问题的症结所在。代码中几乎所有内容都是异步的(例如I2C读/写和MongoDB更新)。所有异步的东西都在if语句后面,并带有一些布尔逻辑,以确保只在应该调用的时候调用它。我只是想得不对吗?尝试将所有内容都基于事件是更好的方法吗?我来自PLC编程的国度,在那里你必须在一个同步运行的环境中编写异步代码,这可能就是我困惑的原因。谢谢你的回复。我用蓝知更鸟来宣传一切,这非常有帮助。所以我的印象是,虽然(真正的)无限循环会导致代码锁定。在其中使用async/await可以防止while(true)导致性能问题,这是怎么回事?如果在
while(true)
之后删除
await
,则仍会重复调用
循环
函数。不同之处在于,使用
await
可以确保在新迭代开始之前,上一次迭代已经完成(异步函数/承诺已经解决),这样就不会浪费内存和计算能力同时运行多个迭代。@spitive_moose作为
while(true)await
的替代方法,您可以同样地编写
函数startoop(){return loop()。然后(startoop);}