2015-08-20 2 views
3

Вчера я был опрошен компанией XYZ, они дали мне следующую проблему в режиме реального времени.Как мы можем оптимизировать автозаполнение Google?

Как мы все знаем, как работает автозаполнение google. Он отправляет вызов AJAX для каждого введенного вами символа. Поэтому, даже когда я еще не закончил набирать, он отправляет все запросы на сервер для каждого символа, который я нажал. (например, я хочу найти who is the biggest fool on the internet, затем для каждого символа он вызывает вызов AJAX).

Вопрос был «Как мы можем оптимизировать это?»

Я дал ему решение прервать запрос предыдущий АЯКС, если клавиша нажата снова. Но, похоже, интервьюер не был убежден в этом. Поэтому, пожалуйста, предложите, что может быть лучшим решением для этого?

Спасибо заранее,

+0

Оптимизируйте в каком смысле? Вопросы для интервью часто преднамеренно открыты, что не очень хорошо подходит для SO. – 1983

ответ

0

Может, вероятно, отслеживающий последнее нажатие клавиши в поле поиска, и поэтому, когда проходит некоторое время (500мс или что-то), а затем отправить значение поискового поля.

+0

nope ... это не решение. мы не можем удерживать пользователя даже для ms –

+0

С того момента, как вы перестали печатать, ожидаете даже несколько секунд, а затем отправили один полный пакет слишком много? да давайте отправим 64 неполных пакета, конечно. Кроме того, я не вижу, как будет отменен предыдущий запрос ajax, пакеты ajax отправляются в немедленной форме, только вы можете отказаться от ответа (и только совершенно откровенно просто путем исключения из обратного вызова события ответа) , –

0

Вы можете оптимизировать, если сервер отправит дельта из последнего ответа. Например, предположим, что пользователь набрал несколько символов и получил список из 10 лучших дополнений, которые отображаются пользователю. Теперь он набирает другой символ, поэтому сервер вычисляет новый список из 10 лучших дополнений. Этот список, вероятно, будет иметь некоторые дополнения к предыдущему списку, а также несколько новых завершений. Поэтому идея состоит только в том, чтобы вычислять и отправлять новые доработки и вместе с их позициями, поэтому клиент может обновить свой список лучших дополнений.

0

Существует мало что можно сделать, просто из-за ограничений, с которыми вам приходится работать (браузер, ajax, ...).

Единственные трюки я могу думать будет:

  1. проверять каждый символ. пробелы и другие специальные символы не вызывают запрос ajax, а только любой «реальный» символ. Таким образом, «я», имеет только 3 запроса, вместо 4.
  2. Вы добавляете «задержку» (например, 100 мс) после ввода первого символа (или первых двух), так что у вас нет запроса на каждый один символ, но вводится только каждые 2 символа. Если кто-то набирает среднюю скорость, которая должна сохранять несколько запросов, не чувствуя себя иначе.
  3. вместо использования ajax, вы создаете соединение в сети. таким образом вы можете отменить последний запрос при вводе нового символа. Если вы тщательно разработаете свой протокол, вы получите первые несколько ответов для первого символа (который вы уже показываете), но проигнорируйте остальные, так как второй ответ уже встает.
  4. вы «предварительно загрузите» некоторые данные. Это может быть достигнуто, то есть уже загружать первые ответы для всех букв (a-z) на самой странице, поэтому, когда пользователь вводит первый символ, на самом деле нет запроса, но все же что-то для отображения.
  5. Если вы работаете с техникой 2, вы можете немного обмануть и использовать парсинг на стороне клиента, чтобы отфильтровать результат из последнего запроса для любых условий «все еще» (т. Е. Последний запрос, что «wh» -> и типы пользователей в «о», то вы берете предыдущий список результатов и сохраняете все записи с «кем» в нем). Таким образом, вы показываете что-то, даже если ответа еще нет, а с другой стороны, если есть достаточно результатов, которые связаны с новым термином, вы можете вообще не отправлять запрос.
Смежные вопросы