在第一次调用返回之前第二次调用Strophe.Connection.sendIQ()?

时间:2019-05-30 21:08:36

标签: xmpp ejabberd strophe bosh candy

这可能不是错误,而是必要的功能,但是... 我使用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',是否需要在每次循环迭代时增加它的数量?

0 个答案:

没有答案