нет ошибки, но не отвечает - PullRequest
0 голосов
/ 23 июля 2011

Я noob во Flex / Actionscript, поэтому у меня есть код, где компилятор не показывает ошибку, но код ничего не возвращает. Можете ли вы помочь мне исправить это?

Main.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="main()">
    <fx:Script>
        <![CDATA[
            include 'AS/main.as';

            private function main():void {
                Label1.text = Login('irakli','password1');
            }

        ]]>
    </fx:Script>
    <s:Label id="Label1" x="370" y="176" text="Label"/>
</s:Application>

main.as

// ActionScript file
import flash.events.*;
import flash.net.*;

var Answer:String;

function Login(username:String, password:String){
    var loader:URLLoader = new URLLoader();
    var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');

    request.method = URLRequestMethod.POST;
    var variables:URLVariables = new URLVariables();
    variables.username = username;
    variables.password = password;
    request.data = variables;

    //handlers
    loader.addEventListener(Event.COMPLETE, function(e:Event):void{
        var loader:URLLoader = URLLoader(e.target);
        Answer = loader.data;
    });
    loader.load(request);

    var i:int = 1;
    while (i < 10000000000){
        if (Answer.length > 0){
            return Answer; 
            break;
        }
        i++;
    }
}

Я знаю о том, что хорошо использовать функции обработчика событий, но я хочу, чтобы этот код работал в main.mxml Label1.text = Login('irakli','password1');

Ответы [ 4 ]

1 голос
/ 23 июля 2011

Извините, но это один из самых уродливых кодов ActionScript, которые я когда-либо видел :( Не могу представить, с какого языка вы пришли. PHP?

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

В частности, о коде:

  • Какова цель выражения include в вашем коде? Почему бы не встроенный код в блоке Script. Ваш способ модуляции кода - лучшая идея, чтобы сделать код неясным, трудным для чтения и поддержки.
  • Пожалуйста, прочитайте и следуйте соглашениям по именованию и кодированию ActionScript . Это необходимо, когда вы делитесь своим кодом с кем-то (членом команды или SO).
  • Ваш Login метод ничего не возвращает. Почему вы ожидаете, что Login('irakli','password1') выдаст какой-либо текст?
  • Пожалуйста, поймите, асинхронный характер Flash и ActionScript. Чтобы лучше это понять, пожалуйста, не используйте встроенные обработчики событий, а создайте для них отдельные методы.
1 голос
/ 23 июля 2011

uiiuiui.здесь много неправильных вещей.

старайтесь не использовать переменные / функции с заглавными буквами

private var _myVar:String = "string";

private function myFunction():void
{

}

объявляйте ваши переменные / функции как частные / публичные / защищенные

определите тип возвращаемого значения вашей функции

private function login (username:String, password:String):String
{

}

, который вы здесь не используете, просто включите свой метод login () в Main.mxml

, не используйте анонимные функции вобработчики событий - вместо этого определите пользовательскую функцию с именем :

loader.addEventListener(Event.COMPLETE, onComplete);

private function onComplete(event:Event):void
{
   // do sth here ...
}

и не используйте цикл while для ожидания результата вашего URLLoader - для этого и нужен Eventlistener.

Лучше всего было бы, если бы вы создали класс Login, который обрабатывает back-end-сообщения login и возвращает результат (в порядке или не в порядке) в зависимости от ответа сервера.

package
{
  public class Login
  {
    public function Login()
    {

    }

    public function doLogin(username:String, password:String):void
    {
       // do loader stuff here ...
       loader.addEventListener(Event.COMPLETE, onLoginResponse);
    }

    private function onLoginResponse(evt:Event):void
    {
       // check answer from server
       if (server.response == "ok")
       {
         dispatchEvent(new Event('logged_in'));
       }
    }
  }
}
1 голос
/ 23 июля 2011

Извините, но желать, чтобы это работало таким образом, просто неправильно.У вас нет гарантии, что этот абсурдный цикл сработает, потому что он может легко завершиться до того, как сработает ваша операция загрузки.Кроме того, наличие встроенной функции в вашем обработчике событий считается плохой практикой.

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

Вот как вы могли бы написать Логин как класс:

package {
    import flash.events.*;
    import flash.net.*;

    public class Login extends EventDispatcher
    {
        public function Login(username:String, password:String):void
        {
            var loader:URLLoader = new URLLoader();
            var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');
            request.method = URLRequestMethod.POST;
            var variables:URLVariables = new URLVariables();
            variables.username = username;
            variables.password = password;
            request.data = variables;

            loader.addEventListener(Event.COMPLETE, loadCompleteHandler);
            loader.load(request);
        }

        private function loadCompleteHander(evt:Event):void
        {
            // set the event on out of the class
            dispatchEvent(evt);
        }
    }
}

Итак, вы бы использовали это так:

var login:Login = new Login('irakli','password1');
login.addEventListener(Event.COMPLETE,setTheText);

function setTheText(evt:Event):void
{
    Label1.text = evt.target.data;
}

Конечно, если вы неЕсли вы не хотите, чтобы в вашем mxml были слушатели (и я не могу понять, почему это так), то я думаю, что вашим лучшим подходом было бы передать целевой textField в вашу функцию Login и позволить ему устанавливать текст во встроенном обработчике.Что-то вроде:

Login('irakli','password1',Label1);

main.as

// ActionScript file
import flash.events.*;
import flash.net.*;
import flash.text.TextField

var targetTF:TextField;

function Login(username:String, password:String,textField:TextField){
    targetTF = textField;
    var loader:URLLoader = new URLLoader();
    var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');

    request.method = URLRequestMethod.POST;
    var variables:URLVariables = new URLVariables();
    variables.username = username;
    variables.password = password;
    request.data = variables;

    //handlers
    loader.addEventListener(Event.COMPLETE, function(e:Event):void{
        var loader:URLLoader = URLLoader(e.target);
        targetTF.text = loader.data;
    });
    loader.load(request);
}
1 голос
/ 23 июля 2011

Я вижу кучу проблем:

  1. Ваша функция не указывает тип возвращаемого значения или модификатор доступа
  2. URLLoader асинхронный, но, похоже, вы хотите, чтобы ваш код выполнялся синхронно.
  3. Ваша анонимная функция в событии завершения URLLoader не будет выполняться в строке; поэтому последняя половина вашего метода будет выполнена перед завершенным обработчиком.

Попробуйте изменить вещи, чтобы разбить их на две функции, например:

public function Login(username:String, password:String):void{
    var loader:URLLoader = new URLLoader();
    var request:URLRequest = new URLRequest('http://localhost/hosting/index.php');

    request.method = URLRequestMethod.POST;
    var variables:URLVariables = new URLVariables();
    variables.username = username;
    variables.password = password;
    request.data = variables;

    //handlers
    loader.addEventListener(Event.COMPLETE, onLoaderComplete); 
    loader.load(request);
}

public function onLoaderComplete(e:Event):void{
 var loader:URLLoader = URLLoader(e.target);
 Answer = loader.data;
 label1.text = Answer;
}

В вашем обработчике завершения создания попробуйте что-то вроде этого:

Login('irakli','password1');

Вызывает метод. И значение метки задается в полном обработчике. Ваш метод ожидания результатов создает, но не нужен.

...