首页 > 代码库 > jquery的Deferred 对象初体验

jquery的Deferred 对象初体验

  之前阅读了阮一峰老师的jQuery的deferred对象详解一文,结合jquery手册,算是对Deferred对象有了初步的认知。今天便来分享一下我自己的一些体会。

  一、deferred可以方便的添加回调

      先来看下面的例子

        

1 var test = function(callback) {2     setTimeout(function() {3       console.log(‘我完成了‘);4       callback(‘我是回调‘)5     }, 1000)6 };7 test(function(text) {8     console.log(text)9 });

      上面的函数test在调用时我们传入了一个回调,在test被调用1秒后回调执行。这段代码现阶段运行的很好,下面我们来用deferred对象来改写一下。

 1 var test = function(dfd) { 2   setTimeout(function() { 3     console.log(‘我完成了‘); 4     dfd.resolve(‘我是回调‘); 5   }, 1000) 6 } 7  8 $.Deferred(test).done(function(text) { 9   console.log(text)10 })

      上面的代码运行的也很好。

      接下来如果我们希望为test函数再添加一个回调函数,那上面的2段代码需要怎么修改呢?

    第一段可以改为:(方式很多,但都需要进入test函数内进行修改)

 1    var test = function (callback, callback2) { 2             setTimeout(function () { 3                 console.log(‘我完成了‘); 4                 callback(‘我是回调‘); 5                 callback2(); 6             }, 1000) 7         } 8         test(function (a) { 9             console.log(a);10         }, function () {11             console.log(‘我是回调2‘);12         });

    第二段改为:(只需再次调用done方法)

  

 1        var test = function (dfd) { 2             setTimeout(function () { 3                 console.log(‘我完成了‘); 4                 dfd.resolve(‘我是回调‘); 5             }, 1000) 6         } 7  8         $.Deferred(test).done(function (a) { 9             console.log(a)10         }).done(function () {11             console.log(‘我是回调2‘)12         })

    其中,我们为第一段代码中的test函数新增了一个参数,并在调用时传入第二个回调函数。第二段代码只需要再使用延迟对象的done方法即可。比较这两种方式,可以明显的发现使用deferred对象可以更加方便的管理添加回调函数。而第一段代码虽然有很多种方式来实现添加回调,但无论如何都需要进入到test函数内部进行修改,这大大增加了程序的耦合性与维护成本。

    二、deferred可以为多个操作指定回调函数

    有时候我们需要在程序中同时调用2个耗时不同的函数,这时候如果我们希望在这两个函数都执行完后再执行回调函数,应该怎么做呢?

    传统的方式实现起来就显得不够优雅了,而使用deferred对象与$.when方法可以轻松的实现。

 1      var test1 = function (dfd) { 2             setTimeout(function () { 3                 console.log(‘test1‘); 4                 dfd.resolve(‘test1执行完毕‘); 5             }, 1000) 6         } 7         var test2 = function (dfd) { 8             setTimeout(function () { 9                 console.log(‘test2‘);10                 dfd.resolve(‘test2执行完毕‘);11             }, 2000)12         }13         $.when($.Deferred(test1), $.Deferred(test2)).done(function (a, b) {14             console.log(a);15             console.log(b);16             console.log(‘2个函数都执行完毕‘);17         })

    可以看出用deferred实现起来既方便又优雅。

 

    以上是我对deferred对象的一些初步认知,水平有限,欢迎大家指正。

      

 

 

 

    

jquery的Deferred 对象初体验