js线程问题

js线程问题

今天同事遇到一个问题。点击左侧Dataview做的view,rd.commit虽然执行了,Dataview的store也立马更改了,但是由于itemclick后,使用ShineMessageHub触发了事件,而该事件在多处进行了监听,结果itemclick触发后,很久左侧的dataview的样式才变化。

问题可能描述的不清楚。但是提炼出来,需要关注下面几个问题。

js是单线程的

如下面简单的例子,密集的计算后,才执行setTimeout延时的代码。所以下面的代码,在浏览器终端中,先输出的是999999999,最后才输出第一句的延时代码,输出1。

所以,针对此现象,store变化之后,更改样式是个延时操作。需要在ShineMessageHub触发的事件结束后,线程才有机会执行,重新渲染。

function test (){
    setTimeout(function(){
        console.log(1);
    },0);
    var i =0;
    tmp=0;
    for(;i<1000000000;i++){
        tmp=i;
    }
    console.log(tmp);
}

Ext中的触发事件,其实是立即执行的

Ext中的事件机制,其实是立马执行的。具体实现,别人有例子。(PHP中,php-crud-api中也有注册路由,回调的形式。)

//组件的其他地方,监听了这样的一个方法
ShineMessageHub.on("mytestevent",function(msg){
    console.log(2);
});
//某按钮点击事件
handler:function(btn){
   setTimeout(function(){
       console.log('1');
   },0);
   ShineMessageHub.fireEvent("mytestevent",1);
}

store更改之后,dataview需要时间渲染(猜测)

猜测dataview中也有个setTimeout之类的延时,在排队。

总结

综上,虽然不清楚具体的原因。但是学习js需要关心这几个知识点。