我开始学习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>

我想念的是什么?这是正确的行为吗?我是否应该添加更多处理程序以获取其他节?
谢谢前进

最佳答案

似乎是在调用函数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;否则,返回true。返回false将在返回处理程序后将其删除。

因此,只需添加一行即可解决:
 connection.addHandler(testHandler,null,"presence");
 function testHandler(stanza){
    console.log(stanza);
    return true;
 }

关于javascript - Strophe.addHandler仅从响应中读取第一个节点是正确的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2912530/

10-09 23:32