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