Flex ожидает httpservice для возврата данных - PullRequest
2 голосов
/ 22 декабря 2011

Серьезно. Flex очень раздражает меня. Есть ли способ заставить его ждать httpservice, чтобы получить свои данные без использования таймера?

На данный момент мой код выглядит так:

protected function loginUser(event:MouseEvent):void
{
    if(txtEmail.text == "" || txtPassword.text == "")
    {
        Alert.show("Please complete all fields!", "Oops!");
    }
    else
    {
        user = new User(txtEmail.text, txtPassword.text);
        user.login(user);

        var loginTimer:Timer = new Timer(1000, 1);
        loginTimer.addEventListener(TimerEvent.TIMER_COMPLETE, dispatchLoginEvent);
        loginTimer.start()
    }
}

Когда я делаю user.login(), он отправляет запрос с HTTPservice из моего внешнего класса AS. В обработчике события результата для этого httpservice я установил для публичной переменной значение true или false, в зависимости от того, правильно ли указаны учетные данные пользователя в БД.

Затем я использую метод получения, чтобы получить это логическое значение. Однако без таймера он всегда возвращает false, потому что мой код работает быстрее, чем обработчик результата события. Если это имеет смысл.

Так что я должен использовать таймер, чтобы остановить мое приложение на одну секунду ... Но серьезно, это не имеет смысла для меня. Должен быть лучший способ, нет?

Я могу предоставить больше кода, если кто-нибудь захочет помочь мне с этим. Спасибо.

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

Кажется, вы не до конца поняли мой ответ на другой вопрос.

//Note the argument should NOT be a Mouse event, because that would be dispatched by a View.
//you should not have this kind of business logic in a View
protected function loginUser(event:UserEvent):void {
   //validate before even trying to create a user, since this
   //has the side effect of running an HTTPService call
   if (event.login != null && event.password != null) {
      user = new User(event.email, event.password);
      //these are plain old events dispatched by your user 
      //Note that strictly speaking a user should not be retrieving itself
      user.addEventListener('loginSuccess', onLoginSuccess);
      user.addEventListener('loginFailed', onLoginFailed);
   } else {
      dispatchEvent(new Event('incompleteUserDetails'));
   }

}

protected function onLoginSuccess(e:Event):void {
   //do your thing here
}

protected function onLoginFailed(e:Event):void {
   //trigger your error handling logic here
}

Ваш класс UserEvent должен выглядеть примерно так:

package service.event {
   public Class UserEvent extends Event {
      public static const REQUEST_LOGIN:String = 'requestLogin';
      //you may have other events that apply to users as well

      public var email:String;
      public var password:String;

     public function UserEvent (type:String, email:String, password:String):void {
         //I assume this will be dispatched from a View, given your existing code, so it will bubble by default
         super(tyoe, true, true);
         this.email=email;
         this.password=password;
     }
     override public function clone():Event {
        return new UserEvent(type, email, password);
     }
   }
}

Вы отправили бы это из представления на основе значений полей вашей электронной почты и пароля и прослушали его выше в списке отображения.

0 голосов
/ 22 декабря 2011

Если вы используете объект HttpService, я думаю, что правильный путь - использовать ResultEvent и FaultEvent для этого объекта HttpService для обработки данных после их получения.

В следующих примерах вы можете увидеть, как использовать объект HttpService, чтобы он вызывал функцию после того, как данные были полностью получены с сервера.

http://help.adobe.com/en_US/Flex/4.0/AccessingData/WS2db454920e96a9e51e63e3d11c0bf69084-7fdc.html

http://help.adobe.com/en_US/Flex/4.0/AccessingData/WS2db454920e96a9e51e63e3d11c0bf69084-7fdc.html#WS2db454920e96a9e51e63e3d11c0bf66651-7ff3

0 голосов
/ 22 декабря 2011

Правильный шаблон для использования - обратный вызов или прослушиватель событий для вашего объекта User.

protected function loginUser(event:MouseEvent):void
{
    ...

    user = new User(txtEmail.text, txtPassword.text);
    // pass a callback function to the login method 
    user.login(user, function(result:Boolean):void{
            // do something with the result
    });    
}

Вам придется извинить мой код ActionScript, который я не сделал в ближайшее время.Но, надеюсь, вы поняли идею.Никогда не устанавливайте таймер для опроса логического значения объекта во Flex, ответ всегда заключается в регистрации слушателя или какого-либо описания.

...