Вызов Strophe.Connection.sendIQ () второй раз, прежде чем первый вызов вернется? - PullRequest
0 голосов
/ 31 мая 2019

Это, вероятно, не ошибка, а необходимая функция, но ... Я использую CandyJs, который является оболочкой над Strophe. Мне нужно искать пользователей ejabberd по нескольким полям vCard: Пользователь вводит search_term, а Strophe отправляет запрос на поиск search_term в каждом из указанных полей vCard. Результаты поисковых запросов затем объединяются с использованием логического ИЛИ.

Оказалось, что второй вызов 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');
            });

Как видите, внутри цикла на каждой итерации я создаю XML с использованием Strophe.Builder, а затем сразу отправляю запрос с помощью метода sendIQ () Strophe.connection.

Я пробовал это с двумя циклами:

_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 ищет только для первого запрошенного поля («email» в моем случае). Это не то, что мне нужно.

В целом, если _options.searchFields имеет только одно поле, я вижу в окне F12 два запроса, отправленных в ejabberd. Первая имеет раздел поиска, вторая, которая следует сразу же, пуста. В случае, если в _options.searchFields есть два или более полей, я вижу три запроса, отправленных в ejabberd. Первая имеет объединенную поисковую строку, показанную выше, две другие пусты. Почему это так?

Прямо сейчас обе приведенные выше строки поиска имеют id = 'search2'. Нужно ли мне увеличивать его на каждой итерации цикла?

...