2010-05-26 6 views
5

Je commence à apprendre l'utilisation de la bibliothèque strophes et quand je l'utilise addHandler pour analyser la réponse, il semble lire seulement le premier noeud de réponse xml donc quand je reçois un xml comme ça:Est-il vrai que Strophe.addHandler ne lit que le premier nœud de la réponse?

<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> 

Avec le gestionnaire testHandler utilisé comme ça:

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

Il enregistre seulement:

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

Qu'est-ce que je suis absent? Est-ce un bon comportement? Devrais-je ajouter plus de gestionnaires pour obtenir les autres strophes? Merci d'avance

Répondre

11

semble être que lorsque la fonction est appelée addHandler la pile (un tableau contenant tous les gestionnaires d'être appelé) est emptyed lorsque les gestionnaires sont exécutées. Ainsi, lorsque le nœud correspondant aux conditions du gestionnaire est appelé, la pile est effacée et les autres nœuds ne sont plus trouvés. Vous devez donc redéfinir le gestionnaire ou ajouter les gestionnaires auxquels vous vous attendez:

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

ou:

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

pourrait ne pas être la meilleure solution, mais je vais utiliser jusqu'à ce que quelqu'un me donne un meilleur, de toute façon je poste cette solution de contournement pour donner une indication de l'écoulement du im code traitant.

modifier

La lecture de la documentation http://code.stanziq.com/strophe/strophejs/doc/1.0.1/files/core-js.html#Strophe.Connection.addHandler j'ai trouvé cette ligne:

Le gestionnaire doit renvoyer true si elle doit être invoquée à nouveau; return false supprimera le gestionnaire après son retour.

Il sera fixé en ajoutant seulement une ligne:

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

La réponse de markcial est juste.

Renvoie la valeur true dans la fonction de gestionnaire, afin que Strophe ne supprime pas le gestionnaire.

Questions connexes