创建连续执行的代码
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()
而溢出堆栈。很酷吧?
我正在创建一个 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()
而溢出堆栈。很酷吧?