4

だから、私はポートを作成します

var port = chrome.runtime.connectNative("my.native.app");

そして、私は定義します

port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnect);

だから私が電話するとき

port.postMessage({"text":"messsage"});

標準のイン/アウトを使用してネイティブ アプリケーションに送られ、応答が得られます。

これが私の問題です。応答を期待する関数と、そうでない関数がいくつかあります。メッセージを投稿して、(継続的に実行されている) ネイティブ アプリケーションからの応答を待ちたいと考えています。これはどのように行われますか?

ネイティブアプリケーションをステートマシンとして使用することを除いて、「ワンタイムメッセージング」を介しsendMessageNativeてうまく機能することを認識しているため、完了後にアプリケーションを強制終了しますが、これは良くありません。

4

2 に答える 2

6

私の解決策は、各メッセージに一意の ID を割り当て、マップを使用して各メッセージ ID のコールバック関数を格納することです (メッセージのコールバックがある場合)。

ホストからメッセージを受信したら、メッセージ ID を確認し、コールバック マップを検索します。そのメッセージにバインドされたコールバックがある場合は、応答データを渡して呼び出します。

于 2013-11-19T06:16:57.517 に答える
6

別のリスナーを追加しonNativeMessageて、コールバックを呼び出してから登録解除することができます。

クロージャー付きのこのようなもの:

function callbackOnId(ev, id, callback) {
  var listener = ( function(port, id) {
    var handler = function(msg) {
      if(msg.id == id) {
        ev.removeListener(handler);
        callback(msg);
      }
    }
    return handler;
  })(ev, id, callback);
  ev.addListener(listener);
}

/* ... */
callbackOnId(port.onMessage, "someRequestId", callback);
port.postMessage({"text":"message", "id": "someRequestId"});

これで、ポートが を含むメッセージを初めて受信すると、そのメッセージ"id": "someRequestId"callbackが呼び出され、その後、リスナーは自分自身を登録解除します。

必要に応じて、リスナーを削除したり、メッセージ チェックを変更したりする機能を追加できます。

于 2014-07-04T10:01:24.900 に答える