我正在创建一个父子系统,其中Raspberry Pi 3作为父级,一系列Arduinos作为孩子。
父母的主要活动是通过I2C读取/写入数据,托管网络服务器,存储/调用Mongo DB客户端的数据,以及读取/写入GPIO。
我正在寻找的是一种永久拥有“主要”代码块的方法,类似于Arduino的loop()函数中的代码如何工作。
我知道while(true)循环是禁止的,但我担心使用setTimeout来触发重复执行,因为我的代码执行时间差别很大,具体取决于I2C和数据库的内容。
永远的图书馆或PM2会在这里为我服务吗?
答案 0 :(得分:1)
首先,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()
答案 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()
,您不会溢出堆栈。很酷,嗯?