123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- import { guid } from '@/uilts/help'
- // iframe 通信中心
- class IframeMessageCenter {
- constructor() {
- // 缓存事件队列
- this.messageCallbackMap = new Map();
- this.messageFailbackMap = new Map();
- this.timer = null
- this.init()
- }
- send({ info = {}, data = {}, callback, overTime, failback }) {
- if (callback) {
- info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数
- }
- window.parent.postMessage({
- info,
- data
- }, '*');
- if (info.messageId && callback) {
- // 带回调callback 的message, 要求携带messageId,callback,failback等
- this.listen(info.messageId, callback)
- if (failback) {
- this.addFailback(info.messageId, overTime, failback)
- }
- }
- }
- listen(key, callback) {
- // 序列添加失败回调
- this.messageCallbackMap.set(key, { callback })
- }
- addFailback(key, overTime = 2000, failback) {
- // 序列添加失败回调
- this.messageFailbackMap.set(key, {
- time: new Date().getTime(),
- overTime,
- failback
- })
- this.checkTimer()
- }
- init() {
- window.addEventListener('message', (e) => {
- let { info = {}, data = {} } = e.data;
- let key, item
- // 如果有messageId && 是自己发送的
- if (info.messageId) {
- key = info.messageId
- item = this.messageCallbackMap.get(key)
- }
- if (info.actionType && !item) {
- key = info.actionType
- item = this.messageCallbackMap.get(key)
- }
- // 执行成功回调
- if (item) {
- // 序列删除 失败回调
- this.messageFailbackMap.delete(key)
- const callback = item.callback
- callback(data)
- // 序列删除 成功回调
- this.messageCallbackMap.delete(key)
- }
- })
- this.checkTimer()
- }
- checkTimer() {
- if (this.timer) {
- return
- }
- let key, value, now_time
- this.timer = setInterval(() => {
- if (this.messageFailbackMap.size == 0) {
- clearInterval(this.timer)
- this.timer = null
- }
- // 轮询查看有无超期的message信息
- now_time = new Date().getTime();
- for (let item of this.messageFailbackMap.entries()) {
- key = item[0] || ''
- value = item[1] || {}
- if (now_time - value.time > value.overTime) {
- const callback = value.failback
- callback && callback({
- error: 1,
- msg: "message 超时错误"
- })
- this.messageFailbackMap.delete(key)
- }
- }
- }, 1000)
- }
- }
- // messageCenter在每个iframe内实例化一次
- const iframeMessageCenter = new IframeMessageCenter();
- export default iframeMessageCenter;
|