如何得到监听事件的返回值

时间:2022-01-17 17:00:09
如题,以下是我的代码,我想要得到AboutCompany_Read方法的结果做为方法的返回值,该怎么做?

private var txtLoader:URLLoader=new URLLoader();
private var txtRequest:URLRequest=new URLRequest("aa.txt");
public function AboutCompany_Read():String
{
txtLoader.load(txtRequest);
Alert.show(txtLoader.data as String);
txtLoader.addEventListener(Event.COMPLETE,onComplete);
}

private function onComplete(event:Event):String
{
      var loader:URLLoader = event.target as URLLoader;
      if (loader != null)
      {
          return loader.data as String;
      }
      else
      {
           return "";
      }
 }

7 个解决方案

#1


高手啊,期待中.....

#2


事件不能有返回值,,因为这是异步的
以你的例子举例如下
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.controls.DateChooser;
import mx.formatters.DateBase;
import mx.formatters.DateFormatter;
import mx.resources.ResourceManager;
import mx.utils.ObjectUtil;
import mx.controls.TextInput;
import mx.core.UIComponent;
import adobe.utils.ProductManager;

private var txtLoader:URLLoader=new URLLoader(); 
private var txtRequest:URLRequest=new URLRequest("aa.txt"); 

private var returnvalue;

public function AboutCompany_Read():String 

txtLoader.load(txtRequest); 
Alert.show("1,"+txtLoader.data as String); 
txtLoader.addEventListener(Event.COMPLETE,onComplete);
return this.returnvalue;


private function onComplete(event:Event):void 

      var loader:URLLoader = event.target as URLLoader; 
      if (loader != null) 
      { 
          this.returnvalue = loader.data as String; 
      } 
      else 
      { 
          this.returnvalue = ""; 
      }
      Alert.show("2,"+this.returnvalue);
}

private function init() {
AboutCompany_Read();

Alert.show("3,"+this.returnvalue);
}



]]>
</mx:Script>
    
</mx:Application>

运行输出
2,123321
3,undefined
1,undefined

输出结果分析显示
先输出的是1, 结果没有内容
第二输出的是3,即用field代替的所谓的返回值,也没有内容
第二输出的是2,在事件内部的Alert, 有内容
说明事件委托执行的时候,事实上还没有执行到位,就继续往下执行了,而异步的事件此时才返回

#3


这个我知道,如果我要将得到的结果返回应该怎么办呢?现在我要把将读取文件内容的函数作为一个公有的函数,因为我在很多的地方都要调用它,所以需要读取文件,然后有返回值才行。要不然就不能实现代码的重用,要写很多遍。
谢谢解答或者给个思路。

#4


异步的东西只能推送, 也就是说只能在事件里去直接调用方法,否则就要监听
比如心跳监听返回值为不为空,每XX秒一次

#5


那这样的话我不是要将一个方法写很多次?那怎么能实现代码复用呢?

#6


委托和事件都是用于解藕的,而复用的只是事件本身, 解藕的是调用者和被调用者不耦合
从你的例子来看, URLLoader去监听, 触发完成事件后做A, 你也可以同时监听另一个URLLoader如果有的话,完成后也做A, 这样就是所谓的复用了, 同时也是降低耦合,说明事件的结果跟URLLoader不耦合

没听说要写很多次的问题

#7


如果非要在事件内部去影响外部并传递值,除了直接调用,另一种方式其实也是利用事件, 这个事件是当前类的自定义事件,然后也是利用调用者去监听并触发这个事件,事件内部利用参数传值,然后在事件接收的方法内部处理这个参数

这个原理类似C#中的委托和事件,而且大部分有委托和事件机制的语言大多如此处理

#1


高手啊,期待中.....

#2


事件不能有返回值,,因为这是异步的
以你的例子举例如下
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.controls.DateChooser;
import mx.formatters.DateBase;
import mx.formatters.DateFormatter;
import mx.resources.ResourceManager;
import mx.utils.ObjectUtil;
import mx.controls.TextInput;
import mx.core.UIComponent;
import adobe.utils.ProductManager;

private var txtLoader:URLLoader=new URLLoader(); 
private var txtRequest:URLRequest=new URLRequest("aa.txt"); 

private var returnvalue;

public function AboutCompany_Read():String 

txtLoader.load(txtRequest); 
Alert.show("1,"+txtLoader.data as String); 
txtLoader.addEventListener(Event.COMPLETE,onComplete);
return this.returnvalue;


private function onComplete(event:Event):void 

      var loader:URLLoader = event.target as URLLoader; 
      if (loader != null) 
      { 
          this.returnvalue = loader.data as String; 
      } 
      else 
      { 
          this.returnvalue = ""; 
      }
      Alert.show("2,"+this.returnvalue);
}

private function init() {
AboutCompany_Read();

Alert.show("3,"+this.returnvalue);
}



]]>
</mx:Script>
    
</mx:Application>

运行输出
2,123321
3,undefined
1,undefined

输出结果分析显示
先输出的是1, 结果没有内容
第二输出的是3,即用field代替的所谓的返回值,也没有内容
第二输出的是2,在事件内部的Alert, 有内容
说明事件委托执行的时候,事实上还没有执行到位,就继续往下执行了,而异步的事件此时才返回

#3


这个我知道,如果我要将得到的结果返回应该怎么办呢?现在我要把将读取文件内容的函数作为一个公有的函数,因为我在很多的地方都要调用它,所以需要读取文件,然后有返回值才行。要不然就不能实现代码的重用,要写很多遍。
谢谢解答或者给个思路。

#4


异步的东西只能推送, 也就是说只能在事件里去直接调用方法,否则就要监听
比如心跳监听返回值为不为空,每XX秒一次

#5


那这样的话我不是要将一个方法写很多次?那怎么能实现代码复用呢?

#6


委托和事件都是用于解藕的,而复用的只是事件本身, 解藕的是调用者和被调用者不耦合
从你的例子来看, URLLoader去监听, 触发完成事件后做A, 你也可以同时监听另一个URLLoader如果有的话,完成后也做A, 这样就是所谓的复用了, 同时也是降低耦合,说明事件的结果跟URLLoader不耦合

没听说要写很多次的问题

#7


如果非要在事件内部去影响外部并传递值,除了直接调用,另一种方式其实也是利用事件, 这个事件是当前类的自定义事件,然后也是利用调用者去监听并触发这个事件,事件内部利用参数传值,然后在事件接收的方法内部处理这个参数

这个原理类似C#中的委托和事件,而且大部分有委托和事件机制的语言大多如此处理