2017.8.30回调函数、加载时序

回调函数

其实就是一种传参数的思想,在多个页面的时候,我们很多时候会需要调用前一个页面的方法,这个时候就需要到这种做法
第一个页面的代码:

function allCommit(allData){
    console.log(JSON.stringify(allData));
    var Obj = {
        url: "api/apiEmergencyController.do?checkWorkForm",
        data: allData,
        success: function(data) {
            //关闭加载中
            wlbLoadingClose();
            wlbCloseWebview();
        },
        fail: function() {
            //关闭加载中
            wlbLoadingClose();
        },
        error: function(res) {
            //关闭加载中
            wlbLoadingClose();
            console.log('fail');
        }
    };
    wlbPostData(Obj);
}

第二个页面中的代码:

var allDataStr = JSON.stringify(allData);
var param ='allCommit('+allDataStr+')';
console.log(param);
wo.evalJS(param);

这里值得一提的是,evalJS对字符串的处理,一开始allData为对象,如果直接像下面这样子拼接的话是会出问题的

var param ='allCommit('+allData+')';

因为根据隐式类型转换,两者的拼接最后allData会出现类似下面的bug

字符串加上对象

又是类型转换,这都是第几次遇到这个问题了,好好反省一下吧!

前端加载时序问题

setTimeout()调试小技巧,有时候可能是时序方面出现问题,利用setTimeout()设置好时序后,如果成功,那就是证明时序有问题。
项目中的扫码页面,因为页面还没有加载完成就执行plus相关,这个时候就很容易出错。
解决这方面的问题的方法在于,判断什么时候加载完成,只能等加载完成之后才能执行相关的逻辑,否则不能执行
html5+中的barcode部分代码很好的提现了这种思想:

var ws=null,wo=null;
var scan=null,domready=false,bCancel=false;
// H5 plus事件处理
function plusReady(){
    if(ws||!window.plus||!domready){
        return;
    }
    // 获取窗口对象
    ws=plus.webview.currentWebview();
    wo=ws.opener();
    // 开始扫描
    ws.addEventListener('show',function(){
        scan=new plus.barcode.Barcode('bcid',[plus.barcode.QR,plus.barcode.EAN8,plus.barcode.EAN13],{frameColor:'#00FF00',scanbarColor:'#00FF00'});
        scan.onmarked=onmarked;
        scan.start({conserve:true,filename:'_doc/barcode/'});
    });
    // 显示页面并关闭等待框
    //ws.show('pop-in');
    //wo.evalJS('closeWaiting()');
}
if(window.plus){
    plusReady();
}else{
    document.addEventListener('plusready', plusReady, false);
}
// 监听DOMContentLoaded事件
document.addEventListener('DOMContentLoaded', function(){
    domready=true;
    plusReady();
}, false);

你可能感兴趣的:(2017.8.30回调函数、加载时序)