开发者社区> 问答> 正文

jquery $when 多个异步怎么变同步?

想多个异步定时任务,一个接一个触发,不是同时触发

            var task1 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t1');
                    $d.resolve();
                },1000);
                return $d.promise();
            }

            //2
            var task2 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t2');
                    $d.resolve();
                },1200);
                return $d.promise();
            }

            //3
            var task3 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t3');
                    $d.resolve();
                },1200);
                return $d.promise();
            }

            //4
            var task4 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t4');
                    $d.resolve();
                },1200);
                return $d.promise();
            }
      
            $.when(task1(),task2(),task3(),task4()).done(function(){
                console.log('done');
            });

代码没有按预期的结果:t1,等待1秒后出现t2,后面的跟前面一样
但现实是同时触发出现了,不知道是不是哪里写错了...求指导,谢谢!
在线代码例子:可以运行看看效果

如果是用then好像也不行,结果会更奇怪

 var task1 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t1');
                    $d.resolve();
                },1000);
                return $d.promise();
            }

            //2
            var task2 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t2');
                    $d.resolve();
                },1200);
                return $d.promise();
            }

            //3
            var task3 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t3');
                    $d.resolve();
                },1200);
                return $d.promise();
            }

            //4
            var task4 = function(){
                var $d = $.Deferred();
                setTimeout(function(){
                    console.log('t4');
                    $d.resolve();
                },1200);
                return $d.promise();
            }
      
task1().then(task2()).then(task3()).then(task4()).then(function(){
                console.log('ok');
            })
      

输出结果居然是

t1
ok
t2
t3
t4

改回这样就可以了

task1().then(function(){
                return task2()
            }).then(function(){
                return task3()
            }).then(function(){
                return task4()
            }).then(function(){
                console.log('ok');
            })

另外用那些比较好的异步库,如:when.js 那个?

展开
收起
小旋风柴进 2016-06-01 09:18:16 3015 0
1 条回答
写回答
取消 提交回答
  • 同时触发是正常的,因为你就是那样写的,看这里:

    $.when(task1(),task2(),task3(),task4())
    虽然用了when,但你确实是同时执行了task1(),task2(),task3(),task4()这四个函数,所以四个异步操作真心是同时触发的,没毛病!

    如果你希望顺序执行上面4个异步任务,用下面这种方式:

    var tasks = [
        function() {
            var $d = $.Deferred();
            setTimeout(function() {
                console.log('t1');
                $d.resolve();
            }, 1000);
            return $d.promise();
        },
        function() {
            var $d = $.Deferred();
            setTimeout(function() {
                console.log('t2');
                $d.resolve();
            }, 1200);
            return $d.promise();
        },
        function() {
            var $d = $.Deferred();
            setTimeout(function() {
                console.log('t3');
                $d.resolve();
            }, 1200);
            return $d.promise();
        },
        function() {
            var $d = $.Deferred();
            setTimeout(function() {
                console.log('t4');
                $d.resolve();
            }, 1200);
            return $d.promise();
        }
    ];
    
    2019-07-17 19:22:42
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Javascript异步编程 立即下载
JavaScript异步编程 立即下载
23-Vue.js在前端...1506518547.pdf 立即下载