原文地址:
http://kuwamoto.org/2006/05/19/dealing-with-asynchronous-events-part-3/作者:Sho Kuwamoto
译者:Dreamer
我想要谈论一下Flex 2中对RPC呼叫机制的一些改进。如果不是Matt Chotin友好地告诉我Flex 2中的RPC呼叫已经正式改为返回AsyncToken类型的对象,我可能永远都不会知道,这再一次证明了关于Flex他比我知道的多。
使用 AsyncToken 和 Responders 为了使用as-is机制,你要象这样做:
public function getAlbumInfo(albumId: int) : void
- {
-
- myService.request = { type: "album", albumId: albumId };
- var call : AsyncToken = myService.send();
-
- call.albumId = albumId;
-
- call.responder = new Responder(getAlbumInfoResult, null);
- }
- public function getAlbumInfoResult(event: Event) : void
- {
-
- var artistId: int = event.result.album.artistId;
- myAlbumList.addAlbum(event.call.albumId, event.result.album);
-
- myService.request = { type: "artist", artistId : artistId };
- var call : AsyncToken = myService.send();
-
- call.artistId = artistId;
-
- call.responder = new Responder(getArtistInfoResult, null);
- }
- public function getArtistInfoResult(event: Event) : void
- {
-
- myArtistList.addArtist(event.call.artistId, event.result.artist);
- }
你会发现它与上一篇文章中的第一个例子非常相似。 最主要的区别就是现在我们 在framework里而不是在你的代码中实现处理器(handler)。
如果我们有匿名的内部类 如果ActionScript有匿名的内部类,你可以象这样压缩它,就像早先我提到的closure方法一样:
public function getAlbumInfo(albumId: int) : void
- {
- var call: AsyncToken;
-
- myService.request = { type: "album", albumId: albumId };
- call = myService.send();
- call.responder = new IResponder()
- {
- public function result(data:Object):void
- {
-
- var artistId: int = event.result.album.artistId;
-
- myAlbumList.addAlbum(albumId, event.result.album);
-
- myService.request = { type: "artist", artistId: artistId };
- call = myService.send();
- call.responder = new IResponder()
- {
- public function result(data:Object):void
- {
-
- myArtistList.addArtist(artistId,event.result.artist);
- }
- }
- }
- }
- }
即使使用了匿名的内部类(ActionScript 并没有这个东西),我还是觉得它不如 closure 方法易读性高,所以我想我会一直使用osure方法。