没有错误,但没有响应

时间:2011-07-23 15:05:19

标签: flash flex actionscript return

我是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 个答案:

答案 0 :(得分:1)

我看到一堆问题:

  1. 您的函数未指定返回类型或访问修饰符
  2. URLLoader是异步的,但您希望代码同步运行。
  3. 您对URLLoader完成事件的匿名函数不会在线执行;所以你的方法的后半部分将在完整的处理程序之前执行。

  4. 尝试修改内容以将其分解为两个函数,例如:

    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');
    

    它调用该方法。标签的值在完整的处理程序中设置。等待结果的方法是创建,但不必要。

答案 1 :(得分:1)

uiiuiui。这里有很多不妥之处。

尽量不要使用带大写字母的变量/函数

private var _myVar:String = "string";

private function myFunction():void
{

}

将变量/函数声明为private / public / protected

定义函数的返回类型

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

}

你不喜欢在这里使用include - 只需将你的login()方法放在Main.mxml中

不要在事件处理程序中使用匿名函数 - 而是定义一个自定义命名的函数:

loader.addEventListener(Event.COMPLETE, onComplete);

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

并且不要使用while循环来等待URLLoader的结果 - 这就是eventlistener的用途。

最好的事情是,如果你创建一个Login类来处理login-backend-communication并返回结果(ok或not ok),具体取决于服务器的答案。

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'));
       }
    }
  }
}

答案 2 :(得分:1)

很抱歉,但希望以这种方式工作是完全错误的。你不能保证那个荒谬的循环可以工作,因为它可以在你的加载操作之前轻松完成。此外,在事件处理程序中使用内联函数被认为是不好的做法。

正确的做法是让Login成为一个类,并监听一个事件,以便填充文本框。

这就是你可以把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);
}

答案 3 :(得分:1)

很抱歉,但这是我见过的最丑陋的ActionScript代码之一:(无法想象你来自哪种语言.PHP?

首先,在编写代码之前,请先阅读一些基础知识。

特别是关于代码:

  • 代码中include语句的用途是什么?为什么不在Script块中内联代码。您的代码模块化方式是使代码变得模糊且难以阅读和支持的最佳方法。
  • 请阅读并follow ActionScript naming and coding conventions。当您与某人(团队成员或SO)共享您的代码时,这是必要的。
  • 您的Login方法不会返回任何内容。为什么期望Login('irakli','password1')会产生任何文字?
  • 请了解Flash和ActionScript的异步特性。为了更好地理解它,请不要内联事件处理程序,而是为它们创建单独的方法。