给postmessage加上callback方法
postmessage双向通信中,是不能使用回调函数的。
window.postmessage({msg:'hello',callback:function(e){
do something with e
}})
这样是不行的,js会提示function不会被克隆。
我猜啊因为postmessage是通过dom通讯,js对象会被json化
也就是说不能传递方法。
不过,话说回来,有什么不能的呢,大不了,把function tostring一下,也是可以传过去的。
那这里就要考虑你传callback是干什么用了,如果是作为一种自定义 的数据处理方法,你就tostring一下,过去随便用用就好了,就好像foreach那样,传一个方法,在foreach内部用用。
如果就是想要得到返回值,让自己的书写比较连续。业务逻辑比较连续,callback的结果不会再传到对面。也就是说,callback始终是在本window下运行的。
保持业务逻辑连续的在你所写的方法里,不会因为调用postmessage而把业务处理逻辑跳跃到onmessage里。
这是我要在这里讨论的。
1.很显然,callback从来没真正被传递到对面window里。
2.callback将在onmessage(addlistoner里注册的接收事件)里执行。
3.基于以上两点 ,可以得出很简单的结论。在本window里缓存callback,等onmessage接收到对面发回来的数据时,用callback处理即可。
话有点儿绕嘴,分步来一次,应该会更清楚一点。
1.用postmessage发消息给对面。
2.对面收到消息,处理,
3.用postmessage给本地发消息。
4.本地接收到消息,处理
那么本地要用callback去处理,要知道用的是哪个function去处理。那么本地有一个指向callback的变量,就可以得到该callback。
而因为通讯不可能只一次,该callback会被放在数组里,同时会用唯一性id来标示它,而这个标示 也将被告诉对面window,再让对面告诉本地,从而,本地的接收事件中,去调用这个function。
还是绕,
写一下代码吧,也许代码一目了然。
对面的接收单元
window.addEventListener("message", function(e) {
var data = e.data //拿到传递的数据 {msg:'给我来杯可乐',callbackid:'15146484468'}
//打一杯可乐
var res = '返回的可乐'
window.postmessage({result:res,callbackid:data.callbackid})//发出去
}, false);
本地的单元
var callbacks : {}
function 点杯可乐(callback){
callbacks[随机id] = callback
xxxwindow.postmessage ({msg:'给我打一杯可乐',callbackid:'随机id'})
}
function 吃肯德基的方法(){
//点汉堡
点汉堡(吃汉堡的方法)
//点可乐
点杯可乐(喝可乐)
//结账走人了
}
//喝可乐就是callback对吧
function 喝可乐(){
//咚咚咚。。。哈
}
很显然,吃肯德基就是业务,那么业务顺序就是如此的,如果突然跳到接收事件里去吃汉堡,喝可乐,总是很诡异的。
通过,缓存callback假装callback被传递出去,然后被调用,其实,就达到了目的。
以上。
给postmessage加上callback方法的更多相关文章
- 通过Html5的postMessage和onMessage方法实现跨域跨文档请求访问
在项目中有应用到不同的子项目,通过不同的二级域名实现相互调用功能.其中一个功能是将播放器作为单独的二级域名的请求接口,其他项目必须根据该二级域名调用播放器.最近需要实现视频播放完毕后的事件触发,调用父 ...
- 回调函数: 一定要在函数名前加上 CALLBACK,否则有可能引起内存崩溃!
今天又遇到一个莫名其妙的内存崩溃问题,问题代码 EnumChildWindows(...): EnumChildWindows(hwnd_panel_text_watermark, (WNDENUMP ...
- delphi Timage 加上滚动条方法
elphi Timage 加上滚动条方法 1:将 Timage 放入 TScrollBox内,即 [1]设image1.parent:= ScrollBox1; [2]在Object Ins ...
- jQuery.each(object, [callback])方法,用于处理json数组
通用例遍方法,可用于例遍对象和数组. 不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任何对象.回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内 ...
- Javascript中的Callback方法浅析
什么是callback? 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数 ...
- iframe的父子层跨域 用了百度的postMessage()方法
父层:第一个是方法申明 第二个是接收子层过来的数据 <script type="text/javascript"> $("#main").load( ...
- jQuery Callback 方法
Callback 函数在当前动画 100% 完成之后执行. jQuery 动画的问题 许多 jQuery 函数涉及动画.这些函数也许会将 speed 或 duration 作为可选参数. 例子:$(& ...
- 【学亮IT手记】jQuery callback方法实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- form submit 的callback方法
参考:http://hayageek.com/jquery-ajax-form-submit/ form的submit方法返回数据处理. 普通的form: $("#ajaxform" ...
随机推荐
- Swift 变量
变量是一种使用方便的占位符,用于引用计算机内存地址. Swift 每个变量都指定了特定的类型,该类型决定了变量占用内存的大小,不同的数据类型也决定可存储值的范围. 包括整形Int.浮点数Double和 ...
- 005-多线程-锁-JUC锁-LockSupport【使用、Unsafe、对比Object的wait、底层源码】
一.概述 在Java多线程中,当需要阻塞或者唤醒一个线程时,都会使用LockSupport工具类来完成相应的工作.LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能 ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_08-vuejs研究-vuejs基础-v-if和v-for指令
1.2.4 v-if和v-for <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- java nio 缓冲区读写数据(图形详解)
Position 您可以回想一下,缓冲区实际上就是美化了的数组.在从通道读取时,您将所读取的数据放到底层的数组中. position 变量跟踪已经写了多少数据.更准确地说,它指定了下一个字节将放到数组 ...
- JAVA 基础编程练习题43 【程序 43 求奇数个数】
43 [程序 43 求奇数个数] 题目:求 0—7 所能组成的奇数个数. package cskaoyan; public class cskaoyan43 { @org.junit.Test pub ...
- 查看进程的命令ps
查看进程的命令:ps aux strace -p pid(进程id) 杀死进程:kill pid(进程id)强制杀死进程:kill -9 pid(进程id) linux ps 命令查看进程状态linu ...
- centos安装tidy扩展
wget http://pecl.php.net/get/tidy-1.2.tgztar -xvzf tidy-1.2.tgzcd tidy-1.2/usr/local/php/bin/phpize. ...
- MySQL网页端在线查询工具
现在许多应用都移到云服务器上面了,数据库的远程维护.监控成为一大问题,通过TreeSoft数据库管理系统,可以方便的使用浏览器,通过网页操作的方式管理MySQL,Oracle,DB2,PostgreS ...
- linux下maven环境的搭建
1.maven的下载 2.maven的安装和环境变量配置 系统环境linux centos7.2 x64 1.maven的下载 下载地址:https://mirrors.tuna.tsinghua.e ...
- VAO和VBO
我想大家都已经熟悉VBO了吧.在GL3.0时代的VBO大体还是处于最重要的地位,但是与此同时也出现了不少新的用法和辅助役,其中一个就是VAO.本文大致小记一下这两者的联系,帮助大家理解一下这个角色.— ...