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
事件不能有返回值,,因为这是异步的
以你的例子举例如下
运行输出
2,123321
3,undefined
1,undefined
输出结果分析显示
先输出的是1, 结果没有内容
第二输出的是3,即用field代替的所谓的返回值,也没有内容
第二输出的是2,在事件内部的Alert, 有内容
说明事件委托执行的时候,事实上还没有执行到位,就继续往下执行了,而异步的事件此时才返回
以你的例子举例如下
<?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秒一次
比如心跳监听返回值为不为空,每XX秒一次
#5
那这样的话我不是要将一个方法写很多次?那怎么能实现代码复用呢?
#6
委托和事件都是用于解藕的,而复用的只是事件本身, 解藕的是调用者和被调用者不耦合
从你的例子来看, URLLoader去监听, 触发完成事件后做A, 你也可以同时监听另一个URLLoader如果有的话,完成后也做A, 这样就是所谓的复用了, 同时也是降低耦合,说明事件的结果跟URLLoader不耦合
没听说要写很多次的问题
从你的例子来看, URLLoader去监听, 触发完成事件后做A, 你也可以同时监听另一个URLLoader如果有的话,完成后也做A, 这样就是所谓的复用了, 同时也是降低耦合,说明事件的结果跟URLLoader不耦合
没听说要写很多次的问题
#7
如果非要在事件内部去影响外部并传递值,除了直接调用,另一种方式其实也是利用事件, 这个事件是当前类的自定义事件,然后也是利用调用者去监听并触发这个事件,事件内部利用参数传值,然后在事件接收的方法内部处理这个参数
这个原理类似C#中的委托和事件,而且大部分有委托和事件机制的语言大多如此处理
这个原理类似C#中的委托和事件,而且大部分有委托和事件机制的语言大多如此处理
#1
高手啊,期待中.....
#2
事件不能有返回值,,因为这是异步的
以你的例子举例如下
运行输出
2,123321
3,undefined
1,undefined
输出结果分析显示
先输出的是1, 结果没有内容
第二输出的是3,即用field代替的所谓的返回值,也没有内容
第二输出的是2,在事件内部的Alert, 有内容
说明事件委托执行的时候,事实上还没有执行到位,就继续往下执行了,而异步的事件此时才返回
以你的例子举例如下
<?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秒一次
比如心跳监听返回值为不为空,每XX秒一次
#5
那这样的话我不是要将一个方法写很多次?那怎么能实现代码复用呢?
#6
委托和事件都是用于解藕的,而复用的只是事件本身, 解藕的是调用者和被调用者不耦合
从你的例子来看, URLLoader去监听, 触发完成事件后做A, 你也可以同时监听另一个URLLoader如果有的话,完成后也做A, 这样就是所谓的复用了, 同时也是降低耦合,说明事件的结果跟URLLoader不耦合
没听说要写很多次的问题
从你的例子来看, URLLoader去监听, 触发完成事件后做A, 你也可以同时监听另一个URLLoader如果有的话,完成后也做A, 这样就是所谓的复用了, 同时也是降低耦合,说明事件的结果跟URLLoader不耦合
没听说要写很多次的问题
#7
如果非要在事件内部去影响外部并传递值,除了直接调用,另一种方式其实也是利用事件, 这个事件是当前类的自定义事件,然后也是利用调用者去监听并触发这个事件,事件内部利用参数传值,然后在事件接收的方法内部处理这个参数
这个原理类似C#中的委托和事件,而且大部分有委托和事件机制的语言大多如此处理
这个原理类似C#中的委托和事件,而且大部分有委托和事件机制的语言大多如此处理