这可能不是错误,而是必要的功能,但是... 我使用CandyJs,它是Strophe的外壳。 我需要在多个vCard字段上搜索ejabberd用户: 用户将输入search_term,Strophe将发送请求以在每个指定vCard字段中搜索search_term。然后,将使用逻辑OR组合搜索请求的结果。
原来,第二个Strophe.Connection.sendIQ()调用实际上并没有调用ejabberd(除非第一个调用已经返回(并调用了回调函数)?)。
为什么要用这种方式实现?
我想,解决方案是从回调函数中启动第二个搜索请求? 足够多还是在每次后续呼叫之前增加延迟?什么延迟?
更新:
实际上,它与我描述的有些不同。
1.我确定是Strophe和ejabberd之间的互动是负责任的。 Candy直接使用Strophe.Builder和Strophe.Connection函数发送请求。
2.这是我的代码:
$.each(_options.searchFields, function (propertyName, value) {
console.log('searchField=' + propertyName + '\n');
var iq = $iq(
{
type: 'set',
id: 'search2',
to: _options.searchDomain
}).c('query', { xmlns: 'jabber:iq:search' })
.c('x', { xmlns: 'jabber:x:data', type: 'submit' });
iq
.c('field', { type: "hidden", var: "FORM_TYPE" })
.c('value', "jabber:iq:search")
.up()
.up();
iq
.c('field', { var: propertyName })
.c('value', value === null ? searchText : value)
.up()
.up();
_connection.sendIQ(iq, self.onSearchResult, self.onSearchError, 3000);
console.log('iq.toString() = ' + iq.toString() + '\n');
});
如您所见,在每次迭代的循环中,我正在使用Strophe.Builder构建XML,然后立即使用Strophe.connection的sendIQ()方法发送请求。
我尝试了两次循环迭代:
_options.searchFields: {
email: null
,last: null
}
但是在Chrome F12窗口中,我仅看到一个请求以及合并数据:
<body rid='1931970050' xmlns='http://jabber.org/protocol/httpbind' sid='7564ec1adddd2cce69860ca2250e456ad3284f3f'>
<iq type='set' id='search2' to='vjud.planetrisk.com' xmlns='jabber:client'>
<query xmlns='jabber:iq:search'>
<x xmlns='jabber:x:data' type='submit'>
<field type='hidden' var='FORM_TYPE'><value>jabber:iq:search</value></field>
<field var='email'><value>UnclassifiedFouoLes</value></field>
</x>
</query>
</iq>
<iq type='set' id='search2' to='vjud.planetrisk.com' xmlns='jabber:client'>
<query xmlns='jabber:iq:search'>
<x xmlns='jabber:x:data' type='submit'>
<field type='hidden' var='FORM_TYPE'><value>jabber:iq:search</value></field>
<field var='last'><value>UnclassifiedFouoLes</value></field>
</x>
</query>
</iq>
</body>
Strophe在发送两个请求之前将它们合并在一起。还是Chrome F12误导了我们?
对于该组合请求,ejabberd仅在第一个请求的字段(在我的情况下为“电子邮件”)中搜索仅。那不是我所需要的。
总体来说,如果_options.searchFields只有一个字段,我会在F12窗口中看到两个请求发送给ejabberd。第一个具有搜索节,第二个(紧随其后)为空。 如果_options.searchFields具有两个或多个字段,我会看到发送到ejabberd的三个请求。第一个具有上面显示的组合搜索节,其他两个为空。为什么会这样?
现在上面的两个搜索节都具有id ='search2',是否需要在每次循环迭代时增加它的数量?