Strope.addHandler 仅从响应中读取第一个节点,这是正确的吗?
我开始学习 strope 库的用法,当我使用 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>
我的内容我失踪了?这是正确的行为吗?我应该添加更多处理程序来获取其他节吗? 感谢您的提前
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
似乎当调用函数 addHandler 时,堆栈(包含所有要调用的处理程序的数组)在执行处理程序时被清空。因此,当调用符合处理程序条件的节点时,堆栈将被清除,然后将找不到其他节点,因此您必须再次设置处理程序,或者像这样添加您期望调用的处理程序:
或者:
可能不会最好的解决方案,但我会使用直到有人给我一个更好的解决方案,无论如何我发布这个解决方法来提示我正在处理的代码流程。
编辑
阅读http://code.stanziq.com/stropice/stropicejs/doc/1.0.1/files/core-js.html#Stropice.Connection.addHandler 我发现了这一行:
< strong>如果要再次调用处理程序,则应返回 true;返回 false 将在返回后删除处理程序。
因此,只需添加一行即可修复此问题:
Seem to be that when the function addHandler is called the stack ( an array containing all handlers to be called ) is emptyed when the handlers are executed. So when the node matching the handler conditions is called the stack is cleared and then the other nodes will not be found, so you have to set the handler again, or add the handlers you expect to be called like this :
or:
might not be the best solutions, but i'll use until someone gives me a better one, anyways i post this workaround to give a hint of the flow of the code i m dealing with.
edit
Reading the documentation in http://code.stanziq.com/strophe/strophejs/doc/1.0.1/files/core-js.html#Strophe.Connection.addHandler i found this line :
The handler should return true if it is to be invoked again; returning false will remove the handler after it returns.
So it will be fixed by adding only a line :
马克西亚的回答是正确的。
在处理函数中返回 true,因此 Strope 不会删除该处理程序。
markcial's answer is right.
Return true in the handler function, so Strophe will not remove the handler.