Это правильно, что Strophe.addhandler читает только первый узел от ответа?

StackOverflow https://stackoverflow.com/questions/2912530

  •  04-10-2019
  •  | 
  •  

Вопрос

Я начинаю изучать использование библиотеки 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>

Что мне не хватает? Это правильное поведение? Должен ли я добавить больше обработчиков, чтобы получить другие Stanzas? Спасибо за аванс

Это было полезно?

Решение

Похоже, что когда функция 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, если он должен быть вызван снова; Возвращая false удалит обработчик после его возвращения.

Так что это будет исправлено, добавив только строку:

 connection.addHandler(testHandler,null,"presence");
 function testHandler(stanza){
    console.log(stanza);
    return true;
 }

Другие советы

Ответ маркиала прав.

Вернитесь в функцию обработчика, поэтому Strophe не удалит обработчик.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top