2010-05-26 3 views
5

estoy empezando a aprender el uso de la biblioteca y la estrofa cuando uso addHandler a analizar la respuesta parece a leer sólo el primer nodo de la respuesta XML de modo que cuando recibo un xml así:¿Es correcto que Strophe.addHandler lea solo el primer nodo de la respuesta?

<body xmlns='http://jabber.org/protocol/httpbind'> 
<presence xmlns='jabber:client' from='[email protected]' to='[email protected]' type='avaliable' id='5593:sendIQ'> 
    <status/> 
</presence> 
<presence xmlns='jabber:client' from='[email protected]' to='[email protected]' xml:lang='en'> 
    <status />  
</presence> 
<iq xmlns='jabber:client' from='[email protected]' to='[email protected]' type='result'> 
    <query xmlns='jabber:iq:roster'> 
    <item subscription='both' name='test' jid='[email protected]'> 
    <group>test group</group> 
    </item> 
    </query> 
</iq> 
</body> 

Con el controlador utilizado testHandler así:

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

Sólo se registra:

<presence xmlns='jabber:client' from='[email protected]' to='[email protected]' type='avaliable' id='5593:sendIQ'> 
<status/> 
</presence> 

lo que me falta? ¿es un comportamiento correcto? ¿Debo agregar más controladores para obtener las otras estrofas? Gracias por avanzar

Respuesta

11

Parece ser que cuando se llama a la función addHandler la pila (una matriz que contiene todos los controladores a los que se llama) se vacía cuando se ejecutan los controladores. Así que cuando se llama al nodo que coincide con las condiciones del manejador, la pila se borra y luego no se encuentran los otros nodos, por lo que debe volver a establecer el manejador o agregar los manejadores que espera que se llamen así:

connection.addHandler(testHandler,null,"presence"); 
connection.addHandler(testHandler,null,"presence"); 
connection.addHandler(testHandler,null,"presence"); 

o:

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

podría no ser la mejor solución, pero voy a usar hasta que alguien me da una mejor, de todos modos puedo enviar esta solución para dar un indicio del flujo del código im tratando.

edición

lectura de la documentación en http://code.stanziq.com/strophe/strophejs/doc/1.0.1/files/core-js.html#Strophe.Connection.addHandler me encontré con esta línea:

El manejador debe devolver True si se va a invocar de nuevo; Si devuelve falso, se eliminará el controlador después de que regrese.

por lo que será fijada por la adición de solamente una línea: Respuesta

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

de markcial es correcto.

Devuelve verdadero en la función de controlador, por lo que Strophe no eliminará el controlador.

Cuestiones relacionadas