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