5

私はstropheライブラリの使用法を学び始めています.addHandlerを使用して応答を解析すると、xml応答の最初のノードのみを読み取るように見えるので、そのようなxmlを受け取ると:

<body xmlns='http://jabber.org/protocol/httpbind'>
 <presence xmlns='jabber:client' from='test2@localhost' to='test2@localhost' type='avaliable' id='5593:sendIQ'>
  <status/>
 </presence>
 <presence xmlns='jabber:client' from='test@localhost' to='test2@localhost' xml:lang='en'>
  <status />     
 </presence>
 <iq xmlns='jabber:client' from='test2@localhost' to='test2@localhost' type='result'>
  <query xmlns='jabber:iq:roster'>
   <item subscription='both' name='test' jid='test@localhost'>
    <group>test group</group>
   </item>
  </query>
 </iq>
</body>

ハンドラ testHandler をそのように使用すると:

connection.addHandler(testHandler,null,"presence");
function testHandler(stanza){
  console.log(stanza);
}

ログのみ:

<presence xmlns='jabber:client' from='test2@localhost' to='test2@localhost' type='avaliable' id='5593:sendIQ'>
 <status/>
</presence>

私は何が欠けていますか?それは正しい行動ですか?他のスタンザを取得するには、ハンドラーを追加する必要がありますか? 前もってありがとう

4

2 に答える 2

11

関数 addHandler が呼び出されると、ハンドラーが実行されると、スタック (呼び出されるすべてのハンドラーを含む配列) が空になるようです。したがって、ハンドラ条件に一致するノードが呼び出されると、スタックがクリアされ、他のノードが見つからなくなるため、ハンドラを再度設定するか、次のように呼び出されると予想されるハンドラを追加する必要があります。

 connection.addHandler(testHandler,null,"presence");
 connection.addHandler(testHandler,null,"presence");
 connection.addHandler(testHandler,null,"presence");

また:

 connection.addHandler(testHandler,null,"presence");
 function testHandler(stanza){
    console.log(stanza);
    connection.addHandler(testHandler,null,"presence");
 }

最善の解決策ではないかもしれませんが、誰かがより良い解決策を提供してくれるまで使用します。とにかく、この回避策を投稿して、扱っているコードの流れのヒントを提供します。

編集

http://code.stanziq.com/strophe/strophejs/doc/1.0.1/files/core-js.html#Strophe.Connection.addHandlerのドキュメントを読むと、次の行が見つかりました:

ハンドラーは、再度呼び出される場合は true を返す必要があります。false を返すと、返された後にハンドラーが削除されます。

したがって、次の行のみを追加することで修正されます。

 connection.addHandler(testHandler,null,"presence");
 function testHandler(stanza){
    console.log(stanza);
    return true;
 }
于 2010-05-26T13:47:30.020 に答える
4

マークシャルの答えは正しいです。

ハンドラー関数で true を返すため、Strophe はハンドラーを削除しません。

于 2010-09-07T03:19:57.693 に答える