2 sugus awesome sugus_awesome 于 2013.09.07 16:48 提问

js延迟顺序执行的问题

现在项目中遇到一个问题。就是在前台页面顺序延迟显示后台发送的数据。
比如前台是一个表格,点击前台按钮后,一次获得table上该显示的所有随机序号。
目前的问题不能让这些选择的序号顺序延迟显示。
这个问题类似于在表格中随机点名。
代码不完整:

<table>
   <tr><td>11</td><td>12</td><td>13</td><td>14</td></tr>
   <tr><td>21</td><td>22</td><td>23</td><td>24</td></tr>
   <tr><td>31</td><td>32</td><td>33</td><td>34</td></tr>
   <tr><td>41</td><td>42</td><td>43</td><td>44</td></tr>
</table>
<input type="button" value="顺序延迟加载" id="btnRun" />
<script>
   $(function(){
       $("#btnRun").click(function(){
           // rndArray假如是产生的一个瞬间顺序数组,用来控制表格的td变色
           var rndArray=[3,7,11,1,12,15];
           for(var i=0;i<rndArray.length;i++){
               setTimeout(function(){
                   $("table td").eq(i).addClass("test1").siblings().removeClass("test1");
               },1000);
           }
       })
   });
</script>

今天查阅了一下js是单线程执行的,setTimeout("code()",delay)是在delay后将code插入到代码中。
因此这样肯定无法实现我要的功能。不知道有什么好方法可以实现这个功能,
以前在学习视频的时候看到过这个表格随机点名的效果。

求大神指点该怎么弄。

5个回答

j_clxy
j_clxy   2013.09.07 18:02

递增那个时间间隔不可以吗?
虽然不够精确。

for(var i=0;i<rndArray.length;i++){
    setTimeout(function(){
        $("table td").eq(i).addClass("test1").siblings().removeClass("test1");
    },1000*(i+1));
}

想要精确,就只有递归加回调了。

sugus_awesome
sugus_awesome 你说的递归回调不知道怎么写,我下面简单说下我的解决方法。
接近 5 年之前 回复
sugus_awesome
sugus_awesome setTimeout是在delay时间之后将code插入,所以在单线程异步的setTimeout无法很好实现。不过昨天找到了一个替代方法。
接近 5 年之前 回复
sugus_awesome
sugus_awesome   2013.09.08 14:40

谢谢大家帮忙想办法,昨天搜了很多方法,综合各种,最后找到一种可行的是。ajax同步调用,前台等待后台返回,后台线程sleep。这样可以解决,但希望还有更好的方法。

asiaasia666
asiaasia666   2013.09.10 22:05

本质应该是循环遍历发生了js的一个bug。解决办法看下面的例子。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <TITLE> 简单实验 </TITLE>
        <META NAME="Generator" CONTENT="EditPlus">
            <META NAME="Author" CONTENT="">
                <META NAME="Keywords" CONTENT="">
                    <META NAME="Description" CONTENT="">
                        <script type="text/javascript" src="jquery.js"></script>
    </HEAD>

    <BODY>

        页面报错的话,修改js路径<br/>
        <table border="1">
            <tr>
                <td>11</td>
                <td>12</td>
                <td>13</td>
                <td>14</td>
            </tr>
            <tr>
                <td>21</td>
                <td>22</td>
                <td>23</td>
                <td>24</td>
            </tr>
            <tr>
                <td>31</td>
                <td>32</td>
                <td>33</td>
                <td>34</td>
            </tr>
            <tr>
                <td>41</td>
                <td>42</td>
                <td>43</td>
                <td>44</td>
            </tr>
        </table>
        <input type="button" value="顺序延迟加载" id="btnRun" />
        <script>


           $(function(){
               $("#btnRun").click(function(){
                   // rndArray ,从0开始, 第0个为red,第5个为green,第10个为tomato,地15个为hotpink
                   var rndArray=[0,5,10,15];
                   var colorArray=['red','green','tomato','hotpink'];
                   $("#btnRun").attr('disabled',true);
                   for(var i=0;i<rndArray.length;i++){
                       setTimeout(function(i2){
                            var _i = rndArray[i2];
                            return function(){
                               $("table td").eq(_i).css('background-color', colorArray[i2]);
                            };
                       }(i),1000);
                   }
               })
           });

        </script>
    </BODY>
</HTML>
asiaasia666
asiaasia666   2013.09.07 18:24

很典型的问题,循环遍历问题。

sugus_awesome
sugus_awesome setTimeout是在delay时间之后将code插入,所以在单线程异步的setTimeout无法很好实现。不过昨天找到了一个替代方法。
接近 5 年之前 回复
j_clxy
j_clxy   2013.09.10 17:57

上面的内容不是你全部的需求吗?

setTimeout("code()",delay)是在delay后将code插入到代码中

这句不是很懂。

----- 递增那个时间间隔的做法如下。

var rndArray = [ 3, 7, 11, 1, 12, 15 ];
function chageColor(index) {
    console.log(index);
    $("table td").eq(index).addClass("test1");
}
$("#btnRun").click(function() {
    for ( var i = 0; i < rndArray.length; i++) {
        setTimeout("chageColor(" + rndArray[i] + ")", 1000 * (i + 1));
    }
});

---- 递归回调的做法。处理一个TD后,调用回调。而回调是层层嵌套,以实现每个处理结束后继续下个。

var rndArray = [ 3, 7, 11, 1, 12, 15 ];
function chageColor2(index, callback) {
    console.log(index);
    $("table td").eq(index).addClass("test2");
    if (callback) {
        setTimeout(callback, 1000);
    }
}
$("#btnRun").click(function() {
    var f = false;
    $(rndArray.reverse()).each(function(i, v) {
        f = (function(index, callback) {
            return function() {
                chageColor2(index, callback);
            };
        })(v, f);
    });
    f();
});
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
JS执行顺序-(deferred 延迟队列)
出现问题    函数功能:访问数据库函数(判断数据是否为空),如果为空,则执行alert语句  function a(){  isNullEmpty();   //判断数据是否为空函数; alert(“a”); } function isNullEmpty() {   .....//不为空  alert(b); } 此执行结果为a b,原因是访问数据库比较慢,其他部分先执行。
js执行顺序和js异步
js执行顺序和异步感谢:http://www.cnblogs.com/zhaodongyu/p/3922961.html 感谢:http://www.2cto.com/kf/201401/273825.html单线程异步执行的JavaScriptJavaScript是单线程异步执行的。 单线程意味着代码在任务队列中会按照顺序一个接一个执行。 异步代表JavaScript代码在任务队列中的顺
关于JS执行顺序的问题
在慕课网自由编程时,遇到一个要求: 在网页中插入JS代码,实现输出"JS进阶篇",并弹出对话框,内容为"关注JS高级篇"。 当时首先想到用innerHTML,代码如下: 我们互动下              var obj = document.getElementById("con");         obj.innerHTML = "JS进阶篇";  
JS执行顺序问题
JavaScript执行引擎并非一行一行地分析和执行程序,而是一段一段地分析执行的。而且在分析执行同一段代码中,定义式的函数语句会被提取出来优先执行。函数定义执行完后,才会按顺序执行其他代码。 先看看两个例子: 例子1: var hello = function(){ alert('hello,zhangsan'); } hello();//第一次调用,输出“hello,zhangsa
document.write 方式引入外部 JS 文件导致脚本程序执行顺序不同以及 DOM 树更新延迟问题
标准参考 关于 document.write 方法请参考标准文档:DOM Level 2 HTML 规范 1.5. Objects related to HTML documents。 问题描述 当脚本中存在以 document.write 的方式向页面内写入内容时,各浏览器对于执行各个线程的顺序可能不一致。 造成的影响 此现象造成在各浏览器里,某些需要延后执行的
JS是依照代码顺序执行的,而不是方法体
在JS方法书写时,如果一个大方法体中还要调用其他小方法时,要注意回调问题,由于在js中代码是顺序执行的,不是按照方法一步步一层层执行的 这个问题在苹果手机中可以复现,安卓中没问题
Promise处理JS异步的问题
promise是一款轻量级的JS插件,我们可以利用它来处理JS中的一些异步的问题。我们可以去github上面下载最新的源码。链接地址:https://github.com/stackp/promisejs 。注:咱们做前端或移动hybrid开发的,首先电脑上应该要装有node.一些调试的类对我们还是会有帮助的,比如console类。 首先我们来看一个简单的例子: 按顺序输出一些句子,之前的写法
JavaScript代码执行的先后顺序问题
一、js---&amp;gt;单线程严格意义上来说,javascript没有多线程的概念,所有的程序都是单线程依次执行的。1、什么是单线程?  通俗点说,就是代码在执行过程中,另一段代码想要执行就必须等当前代码执行完成后才可以进行。我们拿一段代码来解释一下吧for(var i=1;i&amp;lt;=3;i++){ setTimeout(function(){ console.log(i); //...
IOS学习 GCD 延时执行三种方法 并行/串行/主队列综合练习 队列组 shift+command+o快速查找
-(void)touchesBegan:(NSSetUITouch *> *)touches withEvent:(UIEvent *)event{        [self demo]; } //延时执行 -(void)demo{     //方法1 timer //    NSTimer *timer = [NSTimer timerWit
js中的for循环与异步回调函数执行顺序问题
上一篇博文“利用HTML5新特性localstorage把用户数据暂时存储在客户端,用于之后上传”里提到了用for循环,但是今天发现for循环不起作用。最终post请求只执行了一次,代码如下 for(i=localStorage.length-1;i>=0;i--){//从后往前依次取每条localstorage local_key=localStorage.key(i); if(local