qwebchannel 多个方法报js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function


/*
 说明:调用qwebchannel.js 的应用js
    qwebchanneltest.js
    
*/
    $.extend({
      testexentd:function()
    {  
      new QWebChannel(qt.webChannelTransport,function(channel)
      {
          //<!--aa js调用QT Demo  -->
          var jsqtBridge =channel.objects.jsqtbridgeobj;
          window.foo=jsqtBridge;
          jsqtBridge.jscallqt();
       }});
     },
      loadXXX01Data:function()
        {
            new QWebChannel(qt.webChannelTransport,function(channel)
                {
                 jsqtBridge =channel.objects.jsqtbridgeobj;
             jsqtBridge.bdXXX01Data(function(content){
            console.log(content);
             alert(content);
            });
        },
     loadXXX02Data:function()
        {
          new QWebChannel(qt.webChannelTransport,function(channel)
                {
                 jsqtBridge =channel.objects.jsqtbridgeobj;
             jsqtBridge..bdXXX02Data(function(content){
            console.log(content);
             alert(content);
            });
              
        }
        ,
     loadXXX03Data:function()
        {
          new QWebChannel(qt.webChannelTransport,function(channel)
                {
                 jsqtBridge =channel.objects.jsqtbridgeobj;
             jsqtBridge.bdXXX03Data(function(content){
            console.log(content);
             alert(content);
            });
             
        }
......
}

在QT与js+html+ qwebchannel 进行开发时,尤其大量方法同时使用,总会莫名其妙发生如下错误,但是调用单个方法偶尔又是好的,

js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function
js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function
js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function
js: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.
js: Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.

经过分析,个人以为主要是qwebchannel 应当是不支持太多个实例化对象,尤其在有回调场景,

如果存在多个方法同时声明实例,很有可能将之前正在等待异步返回的句柄给干掉,导致,出现

“js: Uncaught TypeError: channel.execCallbacks[message.id] is not a function”,那么我们怎么办呢,借鉴数据库访问中的链接打开模式,全局变量,全局初始化 大概思路如下:

   1.全局声明 桥和通道全局   

         var  __jsqtBridge=null;//全局变量  jsqtBridge
         var  __QWebChannel=null;//全局变量 QWebChannel

   2.页面加载时 默认初始化

           $(document).ready(function(){

              //<!---//.......-->
              //初始化__jsqtBridge的方法
              $.init__jsqtBridge();
              });

   3.实际方法使用前进行一次判断,如空,则调用初始化方法

          if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
          {
            $.init__jsqtBridge();
            return false;
          }

   4.测试时可以预留一个测试方法

           testInitjsBride:function()
    {
         alert("开始测试js与QT桥:__jsqtBridge");
          if(__jsqtBridge!=""&&__jsqtBridge!=null&&__jsqtBridge!=undefined)
          {
            alert("__jsqtBridge早已初始成功");
            alert("window.foo.jscallqt()开始调用");
            window.foo.jscallqt();
          }
          else
          {
            alert("js与QT桥未初始化");
            __QWebChannel= new QWebChannel(qt.webChannelTransport,function(channel)
            {
                    //<!--aa js调用QT 真实数据  -->
                    __jsqtBridge =channel.objects.jsqtbridgeobj;
                    window.foo=__jsqtBridge;
                    alert("js与QT桥初始化成功");
                    alert("__jsqtBridge.jscallqt()开始调用");
                    __jsqtBridge.jscallqt();
            });
    
          }
    },

5.完整的原理代码如下:


/*
 说明:调用qwebchannel.js 的应用js
    qwebchanneltest.js
    
*/

var  __jsqtBridge=null;//全局变量  jsqtBridge
var  __QWebChannel=null;//全局变量 QWebChannel



//  new QWebChannel(qt.webChannelTransport,function(channel)
//  {
//  //<!--aa js调用QT Demo  -->
//  var jsqtBridge =channel.objects.jsqtbridgeobj;
//  window.foo=jsqtBridge;
//  jsqtBridge.jscallqt();
// });

    $.extend({

    //初始化 __jsqtBridge的方法
    init__jsqtBridge()
    { 
      try{
     
        __QWebChannel= new QWebChannel(qt.webChannelTransport,function(channel)
                {
                        //<!--aa js调用QT 真实数据  -->
                        __jsqtBridge =channel.objects.jsqtbridgeobj;
                        window.foo=__jsqtBridge;
                       // alert("初始化成功");
                       // __jsqtBridge.jscallqt(); //js调用QT Demo
                });

              }
              catch(e)
              {
                console.log("初始化失败");
              }
    },
    testInitjsBride:function()
    {
         alert("开始测试js与QT桥:__jsqtBridge");
          if(__jsqtBridge!=""&&__jsqtBridge!=null&&__jsqtBridge!=undefined)
          {
            alert("__jsqtBridge早已初始成功");
            alert("window.foo.jscallqt()开始调用");
            window.foo.jscallqt();
          }
          else
          {
            alert("js与QT桥未初始化");
            __QWebChannel= new QWebChannel(qt.webChannelTransport,function(channel)
            {
                    //<!--aa js调用QT 真实数据  -->
                    __jsqtBridge =channel.objects.jsqtbridgeobj;
                    window.foo=__jsqtBridge;
                    alert("js与QT桥初始化成功");
                    alert("__jsqtBridge.jscallqt()开始调用");
                    __jsqtBridge.jscallqt();
            });
    
          }
    },
    
    
       
      loadXXX01Data:function()
        {
          if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
          {
            $.init__jsqtBridge();
            return false;
          }
             __jsqtBridge.bdXXXXData(function(content){
            console.log(content);
             alert(content);
            });
        },
     loadXXX02Data:function()
        {
          if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
          {
            $.init__jsqtBridge();
            return false;
          }
             __jsqtBridge.bdXXX02Data(function(content){
            console.log(content);
             alert(content);
            });
              
        }
        ,
     loadXXX03Data:function()
        {
          if(__jsqtBridge==null||__jsqtBridge==undefined||__jsqtBridge=="")
          {
            $.init__jsqtBridge();
            return false;
          }
             __jsqtBridge.bdXXX03Data(function(content){
            console.log(content);
             alert(content);
            });
             
        }
......
});

$(document).ready(function(){

      //<!---//.......-->
      //初始化__jsqtBridge的方法
      $.init__jsqtBridge();
  
      });

希望能够帮到大家,如有理解错误或不对的地方请大家评论反馈,以便及时改进提高,谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值