Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Проблема при создании живого поиска (http://www.flasher.ru/forum/showthread.php?t=158830)

Temuchin 24.06.2011 03:33

Проблема при создании живого поиска
 
Хочу сделать живой поиск данные грузятся с базы данных на сервере.
пишу на flex. Вот часть кода:
Код AS3:

package
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
 
import mx.controls.Alert;
 
public class SClass
{
private var loaded:URLLoader;
private var nowEasySearchText:String;
public function SClass()
{
searchString.addEventListener(TextOperationEvent.CHANGE, searchString_textInputHandler);
}
private function searchString_textInputHandler(event:TextOperationEvent):void
{
if(searchString.text != null)
{
if(loaded != null)       
{                                     
try                               
{                                 
        loaded.data = null;
        loaded.close();
        loaded = null;
}
catch(e:Error)
{
        loaded.data = null;
        loaded = null;
}
}
var variable:URLVariables = new URLVariables();
variable.text = nowEasySearchText = searchString.text;
loaded = new URLLoader();
loaded.dataFormat = URLLoaderDataFormat.TEXT;
var request:URLRequest = new URLRequest("http://[domanname]/index.php");
request.data = variable;
request.method = URLRequestMethod.POST;
loaded.addEventListener(Event.COMPLETE, loaderCompleteHandler);
loaded.addEventListener(Event.OPEN, openHandler);
loaded.addEventListener(ProgressEvent.PROGRESS, progressHandler);
try
{
loaded.load(request);
}
catch (error:Error)
{
Alert.show(error.message);
}
}
}
private function loaderCompleteHandler(event:Event):void
{
loaded.removeEventListener(Event.COMPLETE, loaderCompleteHandler);
loaded.removeEventListener(Event.OPEN, openHandler);
loaded.removeEventListener(ProgressEvent.PROGRESS, progressHandler);
trace(event.target.data)
{
 
private function openHandler(event:Event):void
{
loaded.data = null;
{
 
private function progressHandler(event:ProgressEvent):void
{
if(searchString.text != nowEasySearchText)
{
loaded.data = null;
loaded.close();
loaded = null;
}
{
}
}

Помогите разобраться почему не работает корректно. При быстром вводе иногда возникает ошибка потока.
В остальных случаях данные забиваются как бы в стек и выводятся медленно друг за другом т.е. вначале ответ на поиск по первой букве потом по первым двум и т.д.

RSovets 26.06.2011 16:54

Вобщем тут как я понял проблема заключается вот в чем.
Столкнулся с такой же проблемой и тоже незнаю как решить.
Есть какая то строка (быстрый поиск как в гугле), при вводе каждого символа в эту строку происходит отправка данных на сервер для моментального поиска.
В итоге поиск может задержаться до 1 секунды (ответ сервера), в форму же уже может ввестись следующий символ и т.п.

Как то что выше работает
Что в итоге происходит: вводится строчка... ну к примеру "абвг". поиск срабатывает после второго символа. Ввели "АБ", идет поиск, потом сразу "В", "Г". После чего начинается примерно следующее: выдаются результаты поиска АБ, потом открывается АБВ и только потом АБВГ. Раньше было еще хуже, допустим на запрос АБВ приходит 30 записей, АБВГ - 10. Результирующий ответ состоял из первых 10 записей для АБВГ, и еще 20 записей от АБВГ.

Теперь главный вопрос, каким образом сделать так, чтобы если я ввел АБ, потом АБВ у меня поток загрузки результатов по запросу АБ прекратился (не нагружал канал, не показывался, не налезал результатами).

andrew911 26.06.2011 19:13

Я бы сделал так:
При отправке запроса (АБ) блокируете отправку новых (просто сохраняете новый запрос куда-то, причем более новый запрос (АБВГ), будет затирать старый (АБВ) ).
При получении ответа смотрите - если есть ожидающий запрос, то отправляете новый запрос.

RSovets 26.06.2011 23:41

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

Aloran 27.06.2011 14:28

А зачем так много запросов???
Допустим мы ввели первые 3 символа. Идет отправка запроса на сервер. Получаем ответ и с вводом следующих символов ищем нужное в результате запроса.

t4arty 27.06.2011 14:35

кстати похожее видел в уроках на demiart, поищите там...

alatar 27.06.2011 15:16

Цитата:

При быстром вводе иногда возникает ошибка потока.
Пытаетесь закрыть соединение, до того как оно открылось.
Цитата:

В остальных случаях данные забиваются как бы в стек и выводятся медленно друг за другом т.е. вначале ответ на поиск по первой букве потом по первым двум и т.д.
От слушателей отписываться надо.

Temuchin 27.06.2011 16:48

А можно как нибудь узнать есть соединение или нет?

t4arty 27.06.2011 17:08

Возможно поможет.


Часовой пояс GMT +4, время: 16:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.