2017-10-30 10 views
1

私は親として子どものシステムとしてRaspberry Pi 3を親として、一連のArduinosを子として作成しています。継続的に実行するコードを作成する

親の主な活動は、I2C、Webサーバーのホスト、Mongo DBクライアントからのデータの保存/呼び出し、GPIOへの読み書きにデータを読み書きすることです。

私が探しているのは、Arduinoのloop()関数のコードがどのように動作するのかと同様に、私の「メイン」コードを永遠に保持する方法です。

私はwhileループがno-noであることを知っていますが、setTimeoutを使用してこの繰り返し実行をトリガーするのは慎重です。なぜなら、コードはI2Cとデータベースの内容によってかなり異なる実行時間を持つからです。

永遠のライブラリーやPM2が私にここで役立つでしょうか?

+0

あなたのコードが純粋に同期しているなら、なぜあなたは 'while(true)'を使わないべきなのかイメージすることはできません。インポートするものについて考える必要があります。次のコードが開始される前に反復が終了するか、特定の間隔でコードが実行されることを確認しますか? –

+0

残念ながら、それは物事が粘着性になるところです。コード内のほとんどすべてが非同期です(たとえば、I2C読み取り/書き込みとMongoDBの更新)。すべての非同期のものはif文の後ろにあり、ブール論理を持ち、それが必要なときだけ呼び出されるようにします。 私はこれについて誤って考えていますか?すべてのことをイベントベースにしようと試みるより良い方法ですか? 私はPLCプログラミングの分野から来ています。そこでは、同期的に動作する環境に非同期コードを記述する必要があります。これはおそらく私の混乱の原因です。 –

答えて

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

お返事ありがとうございます。私はBluebirdを使ってすべてを約束しています。これは非常に役に立ちます。 私は、(真の)無限ループがあなたのコードをロックアップさせる間、印象を受けました。 while(true)がパフォーマンスの問題を引き起こすのを防ぐasync/awaitの使用についてはどうですか? –

+0

'while(true)'の後に 'await'を削除すると、' loop'関数は繰り返し呼び出されます。違いは、 'await'を使うと、新しい反復が始まる前に最後の反復が完了したことを確認できます(非同期関数/ Promiseが解決されたことを確認することができるため、一度に複数の反復を実行する際にメモリと計算能力を浪費しません)。 –

+0

@spiteful_moose 'while(true)await'の代わりに' function startLoop(){return loop()。then(startLoop);と書くこともできます。 } ' – Bergi

1

@Niklasは興味深いがあります。私は正しく、あなたはコードの塊ではなく、プロセスを繰り返したいので、ここであなたが非同期コードの多くを使用することを考慮することを行う方法についての解決策だと理解した場合新しいasync/awaitパラダイムを使用したアプローチ。基本的には

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(); 

、あなたが約束を使用して無限ループを作成します。あなたは「良い」昔ながらのJS(または武装猿はあなたがそれを使用するように強制される)に固執したい場合は、以下の猿が言っ満たすべき。 loop()asyncStuff()を呼び出し、約束が解決するのを待ちます。約束が解決した後、loop()が再び呼び出されます。 whileまたはES6を使用する必要はありません。

このスニペットの興味深い面の1つは、再帰的にloop()を呼び出すためにスタックがオーバーフローしないことです。冷静さ?

関連する問題