Правильно ли, что 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 не удалит обработчик.

Другие вопросы по тегам