您的位置:首页 > 其它

Flex异步调用小结

2016-02-29 10:28 169 查看
1.通过添加事件监听器;

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

<mx:Script>

<![CDATA[

import mx.rpc.events.FaultEvent;

import mx.collections.ArrayCollection;

import mx.rpc.remoting.mxml.RemoteObject;

import mx.controls.Alert;

import mx.rpc.events.ResultEvent;

public function submit():void{

var remote:RemoteObject = new RemoteObject();

//调用在J2EE端remoting-config.xml中配置的暴露出的类的名称 id

remote.destination = "helloWorld";

//调用J2EE端类中的方法

remote.getHelloWorld();

//监听调用成功事件

remote.addEventListener(ResultEvent.RESULT,result);

//监听失败事件

remote.addEventListener(FaultEvent.FAULT,fault);

}

private function result(evt:ResultEvent):void{

Alert.show(evt.result.toString());

}

private function fault(evt:FaultEvent):void{

Alert.show("调用失败!");

}

]]>

</mx:Script>

<mx:Button click="submit()" label="hello" horizontalCenter="0" verticalCenter="0"/>

</mx:Application>

说明

利用事件监听方法,XXX_resultHandler、faultHandler函数可以直接写在页面上,但这样增加了耦合性,比如在页面上直接写如下代码:

public function search(searchStr:String):void

{

lastSearchStr = searchStr;

service.getContactsByName(searchStr).addResponder(new AsyncResponder(getContacts_result, faultHandler));

}

private function getContacts_result(event:ResultEvent, token:AsyncToken):void

{

contacts = event.result as ArrayCollection;

}

private function faultHandler(event:FaultEvent):void

{

Alert.show(event.fault.faultString);

}

2.通过实现异步响应类AsyncResponder;

异步调用必须实现
IResponder接口,该
接口为任何需要响应远程或异步调用的服务提供协定。接口中饮食两个方法:

1.public function fault(info:Object):void

收到错误后由服务调用此方法。虽然 info 被分类为对象,但它通常是(但不总是)一个 mx.rpc.events.FaultEvent。

2.public function result(data:Object):void

收到返回值后由服务调用此方法。虽然 data 被分类为对象,但它通常是(但不总是)一个 mx.rpc.events.ResultEvent。

类AsyncResponder 实现了
IResponder接口,并提供异步调用服务。该类只有三个方法

1.public function AsyncResponder(result:Function, fault:Function, token:Object = null)

使用指定的数据和处理函数构造 responder 实例。

参数

result:Function — 成功完成请求时应调用的函数。格式如下:

public function (result:Object, token:Object = null):void;

fault:Function — 请求完成但出错时应调用的函数。格式如下:

public function (error:FaultEvent, token:Object = null):void;

token:Object (default = null) — 与此请求相关的其他信息。


2.public function fault(info:Object):void

收到错误后由服务调用此方法。

参数

info:Object — 包含有关发生的错误的信息的对象。

3.public function result(data:Object):void

收到返回值后由服务调用此方法。

参数

data:Object — 包含从请求返回的信息的对象。



例子:

<?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"

xmlns:parsley="http://www.spicefactory.org/parsley"

minWidth="955" minHeight="600">

<s:layout>

<s:VerticalLayout horizontalAlign="center"/>

</s:layout>

<fx:Script>

<![CDATA[

import com.home.system.model.UserModel;

import com.home.system.services.mock.LoginServiceMock;

import com.home.utils.MockServiceUtil;

import mx.controls.Alert;

import mx.rpc.AsyncResponder;

import mx.rpc.AsyncToken;

import mx.rpc.events.FaultEvent;

import mx.rpc.events.ResultEvent;

[Bindable]

public var _username : String;

[Bindable]

public var _password : String;

//模拟远程对象

public var mockService:MockServiceUtil = new MockServiceUtil();

public function login () : AsyncToken {

var model1:UserModel;

model1 = new UserModel();

model1.xh="995312";

model1.xm="王一冰";

//添加一个异步桩,用于异步接收处理

var token:AsyncToken = mockService.createToken(model1);

token.addResponder(new AsyncResponder(login_resultHandler,
faultHandler,model1));

return token;

}

private function login_resultHandler(event:ResultEvent,model:UserModel):void

{

var result :UserModel =event.result as UserModel;

Alert.show("event.result:"+result.xm);

Alert.show("UserModel:"+model.xh);

}

private function faultHandler(event:FaultEvent, token:Object = null):void

{

Alert.show(event.fault.faultString);

}

private function handleKeyUp(event:KeyboardEvent):void {

if( event.keyCode == Keyboard.ENTER ) {

login();

}

}

]]>

</fx:Script>

<s:Panel title="loginTitle">

<s:layout>

<s:VerticalLayout horizontalAlign="center"/>

</s:layout>

<mx:Form x="9" y="6">

<mx:FormItem label="username">

<s:TextInput id="username" text="{_username}"/>

</mx:FormItem>

<mx:FormItem label="password">

<s:TextInput keyUp="handleKeyUp(event)" id="password"

text="{_password}" displayAsPassword="true"/>

</mx:FormItem>

<s:Button

label="login"

click="login()"

keyUp="handleKeyUp(event)"

x="86" y="97"/>

</mx:Form>

</s:Panel>

</s:Application>

注意:

token.addResponder(new AsyncResponder(login_resultHandler, faultHandler,model1));

也可以写成:

token.addResponder(new AsyncResponder(login_resultHandler,
faultHandler));

这样的话,响应函数也得改成

private function login_resultHandler(event:ResultEvent):void

private function faultHandler(event:FaultEvent):void

参考文献

1. AsyncResponder类.http://help.adobe.com/zh_CN/AS3LCR/Flex_4.0/mx/rpc/AsyncResponder.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: