js和flash(as3)通信的一种封装思路
前一段时间,写了一个播放器的flash组件,这个播放器比较特殊,它本身什么都干不了,需要用js去控制它才能加载并播放音乐,而且可以解析歌词,还有一些其他的功能,例如:输出频谱信息等等.具体可以看这个demo:
http://www.html-js.com/mj/version1.0.3/flash/index.html
因为组件没完善好,所以请在chrome浏览器查看,其他浏览器可能有bug。
demo里没有显示如何使用频谱信息.
前几天,电脑出了问题,硬盘坏掉了,所以以上的demo和核心组件的代码都被我弄丢了,但是我又实在没有那个精力去重新写了,把一个组件重复写两遍,太没意义.这里只说一下写这个组件时候的思路吧.
1.一切皆异步
上次,第五届D2论坛的时候,有一位嘉宾讲过,js中一切皆是异步,所以有人说js程序员是最聪明的程序员,本来,我们都习惯了js的编程方式了,都忘了非异步的语言都是怎么工作的了,其实仔细想想,自己真的聪明的要命,好吧,自嘲一下,但是,有一天,我跟同事聊ruby,同事说为什么很多人说ruby很优雅,我说因为写ruby就像写作文,写js就像超现实主义,写ruby的时候,你想到一条逻辑,那么你就按照你想的表达出来,甚至你可以随便写一个方法名,指不定ruby中就有这个方法,这种情况在ruby中很常见,同时它的逻辑处理也是顺行的,例如循环处理一个数组,ruby中这样写:数组.each |找到的一个元素| 去干点什么事 end.但是在js中就要用一个for来循环,其实这样是不符合语义的,一般的框架中都会封装一些类似each的方法,其实也是对js的一种改进.
一堆废话后,还是回来吧,其实js和flash的通信的场景类似js用socket和服务器的通信,他们有这些共同点:
通信都是持久的,js和flash的通信实际上不是任何一方突然发起的,而是在flash创建的时候就已经有一条桥梁搭建在他们之间,任何一方都可以发起通信.
通信都是异步的,你不知道什么时候flash会突然发起一个通信给js.
2.封装成事件吧!
下面来研究下,如果一个js和flash通信互相操作,都会有哪些场景:其实无非三种:
js发一个命令给flash,flash执行操作.(js控制播放器的播放,暂停)
flash主动发一个请求给js,js执行操作,不过js并不知道flash什么时候会发这个请求.(在特定的时刻flash返回歌曲的加载信息长度信息频谱信息等)
js发一个请求给flash,flash去执行操作,可能过了一会之后,计算出一个结果来,把这个结果返回给js(js里调用一个方法去问flash现在歌曲播放到哪里了,flash获取到位置后,返回给js,js显示在页面上)
flash发送请求给js?这个情况一般不会出现,忽略
看起来挺复杂,但是,其实,我希望,我能很方便地使用这三个功能,例如:
如果我要让播放器播放音乐,我希望这样去控制它:MusicIt.go("play"),假设MusicIt就是最后封装出来的js对象,其中go方法用来向flash发送命令,参数就是命令的名字,例如:MusicIt.go("pause"),MusicIt.go("stop")
如果我要监听flash中发给js的请求,我希望这样,在flash被初始化之前,我就给flash发回的各种事件绑定事件
源自:http://www.html-js.com/?p=1105
热门文章推荐
- [HLS]做自己的m3u8点播系统使用HTTP Live Streaming(HLS技术)
- [FMS]FMS流媒体服务器配置与使用相关的介绍
- [AS3]什么是M3U8,与HTML5的区别是什么
- AS2.0 让flash自适应全屏,并且不自动缩放
- [AS3]as3.0的sound类常用技巧整理
- [AS3]as3与ByteArray详解、ByteArray介绍、ByteArray用法
- 关于RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
- [JS]分享浏览器弹出窗口不被拦截JS示例