2

私はファームウェアのバックグラウンドを持っており、主に通常の手続き型Cでコードを記述しています。

現在、専用のTCPソケットを介して一部のハードウェアに接続し、カスタムプロトコル形式でデータを交換するために、Webブラウザを入手する必要があります。このテクノロジーは新しい電話、PC、タブレットで機能するため、Websocketルートを選択しました。

私の問題は、Javascriptに真のSleep()関数がないことです。通常、次のようなことを行います。

  1. メッセージを送る。
  2. ハードウェアがメッセージを処理している間、スリープします。
  3. 応答を取得して、プログラムの実行を続行します。

たとえば、いくつかのデータをハードウェアに保存したいと思います。

  1. プロトコルでデータを送信します。
  2. ハードウェアがデータを保存したことを確認する応答を取得します。
  3. 成功した場合はメッセージAを送信し、そうでない場合はメッセージBを送信します。

問題は、スリープがないため、ステップ3を実行できないことです。setTimeoutfunction()について読みましたが、これで問題が解決しません。コールバックイベントが受信した各パケットを処理し、さまざまな関数にジャンプするのは面倒なようです。また、whileループで大量の送信があった場合、これはコールバック関数では不可能に思えますか?

私のアプローチが間違っている可能性があることは理解していますが、この状況に対処するために私の推論を調整する方法を誰かが私に説明できますか?

コメントや提案をいただければ幸いです。

ありがとう、

4

1 に答える 1

0

javascriptにWebsocketの応答があったとしても、スリープを使用してWebsocketの応答を待つべきではありません。スリープを使用すると、ソケットの応答を待つためにサイト全体がハングします。ハングするということは、たとえば、ユーザーからの操作がないことを意味します。

無限のコールバックを処理するには、あちこちにそれらを投げるだけでなく、最初にいくつかの設計を行う必要があります。

これを行うための標準的な方法は、サーバーがメッセージを送信したときに呼び出される(Web)socketのハンドラーを1つ登録することです。アプリケーションは内部的にその状態を記憶し(ステートマシンについて読んでください)、このメッセージをどう処理するかを知っています。この実行時点では、現在の状態です。

ところで。フローがサーバーに要求して応答を待つように記述したとおりである場合は、単純なAJAXの使用を検討してください。WebSocketは、明示的な要求に応答するだけでなく、サーバーが決定したときにサーバーがメッセージを受信者にプッシュできるように設計されています。AJAXはこのユースケース向けに設計されており、同期的に呼び出すことができるため、スリープがなくてもプログラムを線形にすることができます;)

于 2012-09-25T09:10:54.733 に答える