MUI 实现多页面多Webview子页面调用父页面方法 Promise形式 监听返回数据

使用MUI开发过程中遇到多个页面 子页面调用父页面的方法并且同步或者异步获取数据方式使用Promise形式获取父页面返回的数据方法。

Tip: 引入了 lodash 库

 

子页面定义方法:


const Invoking = {
    task: [],
    invoking(method, params) {
        let job = {};
        job.id = method + new Date().getTime();
        job.state = false;
        job.result = null;
        job.timer = null;
        job.task = new Promise((resovle, reject) => {
            if (job.state == true) {
                reject("Wait..");
                return;
            }
            let target = plus.webview.getWebviewById("main");
            if (target == null) {
                reject("WebView Null");
                return;
            }
            job.state = true;
            target.evalJS(`CallMethods.${method}(${params},'${job.id}')`);
            job.timer = setInterval(() => {
                if (job.state == false) {
                    //执行完毕了
                    clearInterval(job.timer);
                    //移除操作
                    _.remove(Invoking.task, function (n) {
                        return n.id == job.id;
                    });
                    resovle(job.result);
                }
            }, 100);
        });
        this.task.push(job);
        return job.task;
    },
    callBack(obj, id) {
        let task = _.find(this.task, { "id": id });
        task.result = obj;
        task.state = false;
    }
}

 

 

父页面定义方法:


/**
 * 公共的调用方法
 */
const CallMethods = {
	/**
	 * 获取资源文件
	 * @param {*} media 
	 */
	getMediaUrl(media, id) {
		console.log("调用:", id)
		vm.jimClient.getMedia(media).then(url => {
			pushInvoking({ code: 200, result: url }, id);;
		}).catch(err => {
			pushInvoking({ code: 500, result: err }, id)
		})
	}
}


/**
 * 将调用的结果返回到子WebView
 * @param {*} obj 
 */
function pushInvoking(obj, id) {
	plus.webview.getWebviewById("chat").evalJS(`Invoking.callBack(${JSON.stringify(obj)},'${id}')`);
}

 

子页面使用方法:

 //下载图片
                    Invoking.invoking("getMediaUrl", `'${msg.msgBody.media_id}'`)
                        .then(url => {
                            console.log("下载完成Url:===>", url);
                        }).catch(err => {
                            console.error("调用错误:", err);
                        })

这里原理是使用定时器+Flag模式  定时器每隔段时间判断标记位Flag的状态 如何为False 那么就删除掉定时器 从task任务中移除自身对象,并且返回数据。

 

因为每个任务给了一个编号Id 所以传给父页面需要带着Id过去,父页面回调JS的时候 需要带数据与Id传过来,子页面通过数组搜索找到任务给他赋值结果,设置标记位为完成状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值