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

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

Что я пропускаю? действительно ли это - правильное поведение? Я должен добавить больше обработчиков для получения других строк файла конфигурации? Спасибо за усовершенствование

5
задан markcial 26 May 2010 в 11:37
поделиться

1 ответ

Похоже, что когда вызывается функция 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 я нашел эту строку:

Обработчик должен вернуть истину, если он должен быть вызван снова; возврат false удалит обработчик после того, как он вернется.

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

 connection.addHandler(testHandler,null,"presence");
 function testHandler(stanza){
    console.log(stanza);
    return true;
 }
10
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: