2010-05-26 23 views
5

tôi bắt đầu học sử dụng thư viện khổ thơ và khi tôi sử dụng AddHandler để phân tích phản ứng có vẻ như read-only cho nút đầu tiên của phản ứng xml nên khi tôi nhận được một xml như thế:Có đúng là Strophe.addHandler chỉ đọc nút đầu tiên từ phản hồi không?

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

Với testHandler xử lý sử dụng như thế:

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

Nó chỉ ghi:

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

gì tôi đang thiếu? nó là một hành vi đúng đắn? Tôi có nên thêm nhiều người xử lý để có được các stanzas khác không? Cảm ơn trước

Trả lời

11

Dường như khi hàm addHandler được gọi là ngăn xếp (một mảng chứa tất cả trình xử lý được gọi) bị trống khi xử lý được thực hiện. Vì vậy, khi nút khớp với điều kiện xử lý được gọi là ngăn xếp sẽ bị xóa và sau đó các nút khác sẽ không được tìm thấy, vì vậy bạn phải đặt lại trình xử lý hoặc thêm trình xử lý bạn muốn gọi như sau:

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

hay:

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

thể không phải là giải pháp tốt nhất, nhưng tôi sẽ sử dụng cho đến khi một người nào đó mang lại cho tôi một tốt hơn, dù sao tôi gửi workaround này để cung cấp một gợi ý của dòng chảy của mã im đối phó với.

chỉnh sửa

Đọc tài liệu trong http://code.stanziq.com/strophe/strophejs/doc/1.0.1/files/core-js.html#Strophe.Connection.addHandler tôi tìm thấy dòng này:

Việc xử lý phải trả lại đúng nếu nó được gọi một lần nữa; return false sẽ loại bỏ trình xử lý sau khi nó trả về.

Vì vậy, nó sẽ được cố định bằng cách thêm chỉ một dòng: Câu trả lời

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

markcial là đúng.

Trả về true trong hàm xử lý, do đó Strophe sẽ không loại bỏ trình xử lý.