Правильно ли, что Strophe.addHandler читает только первый узел из ответа?
Я начинаю изучать использование библиотеки 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>
Что мне не хватает? это правильное поведение? Должен ли я добавить больше обработчиков, чтобы получить другие строфы? Спасибо за продвижение
2 ответа
Кажется, что когда функция 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, я нашел следующую строку:
Обработчик должен вернуть true, если он должен быть вызван снова; возвращение false удалит обработчик после его возврата.
Так что это будет исправлено путем добавления только строки:
connection.addHandler(testHandler,null,"presence");
function testHandler(stanza){
console.log(stanza);
return true;
}
Ответ Markcial правильный.
Верните true в функцию обработчика, поэтому Strophe не удалит обработчик.