深信不疑这种写法,很好的解释了地点的API的用法。jQuery.Deferred()用于成立一个Deferred对象。

上一节末,提到了一个题材,在延迟(异步)操作中,见面临成功、失利二种肯能性。也交由了用Callbacks来处理那二种状态的解决方案。可是觉得太费劲了。这一节就用Deferred来化解该难题。

在支付中,大家也许会碰着越发错综复杂的场地,须求履行多个延迟操作,然后根据那三个延迟操作的结果开展回调处理。此时该怎样回应呢?

 

 

$(function(){
                function fn1(value){
                    console.log(arguments.length,value);
                }

                function fn2(value){
                    return "fn2, " + value;
                }

                function fn3(value){
                    fn1(fn2(value));
                }

                var deferred1 = jQuery.Deferred(function(deferred){
                        var success = new Date().getTime()/2==1;
                        if(success){
                            deferred.resolve("success");
                        }else{
                            deferred.reject("fail");
                        }

                    });

                var deferred2 = jQuery.Deferred(function(deferred){
                        var success = new Date().getTime()/3==0;
                        if(success){
                            deferred.resolve("success");
                        }else{
                            deferred.reject("fail");
                        }

                    });

                var deferred = jQuery.when(deferred1, deferred2);                
                deferred.done(fn1).fail(fn3);                            
            });

 通过对Callbacks 的询问,也了解了经过Callback怎么来落到实处异步回调(也足以称之为延迟回调)。

 

$(function(){
                function fn1(value){
                    console.log(arguments.length,value);
                }

                function fn2(value){
                    return "fn2, " + value;
                }

                function fn3(value){
                    fn1(fn2(value));
                }

                var deferred = jQuery.Deferred();
                deferred.done(fn1).fail(fn3);       

                setTimeout(function(){                
                    var success = new Date().getTime()/2==1;
                    if(success){
                        deferred.resolve("success");
                    }else{
                        deferred.reject("fail");
                    }
                },10000);
            });

 

注册方法

触发方法

doneCallbacks

done(failCbs)

resolve

resolveWith

failCallbacks

fail(failCbs)

reject

rejectWith

progressCallbacks

progress(progressCbs)

notify

notifyWith

通用的

then(doneCbs,failCbs,progCbs)

 

 

Always(cbs) 不论成功或失败都会调用

 

不论是是使用Callbacks,仍旧采用Deferred,都不可避免的有八个进程:1)注册回调函数,2)触发回调。Deferred中既然有了那些Callbacks,那么自然就有了与之对应的挂号函数,触发回调的函数。

实际上呢,在Deferred的中间,是有三个Callbacks对象的:doneCallbacks (成功时选择的回调链), failCallbacks(失利时拔取的回调链), progressCallbacks(处理速度的回调链)。

方式二:

上边用Deferred来落到实处延迟回调:

Deferred,是jQuery为大家提供越来越强大的依据Callbacks完毕的延期处理(异步处理)工具。使用它可以很有益的化解眼前的难题。其它要注解的是,Deferred在Python,Java,Dojo中都有一致的类库,有趣味的童鞋能够驾驭一下。

 

  

 

下面的挂号格局,底层就是调用的Callbacks对象的add方法,同理resolve方法底层就是调用的是Callbacks对象的fire,fireWith方法。

 

  

 

 在该方法中,创制Deferred对象时,传递了一个A:function(deferredProxy){}的函数,A
函数会在jQuery.Deferred再次来到之前被调用。A函数中的this是一个新的Defferred对象(下面例子中的deferredProxy),也是A函数的率先个参数deferredProxy。

 

 

$(function(){
                function fn1(value){
                    console.log(arguments.length,value);
                }

                function fn2(value){
                    return "fn2, " + value;
                }

                function fn3(value){
                    fn1(fn2(value));
                }
                debugger;
                var deferred = jQuery.Deferred(function(deferredProxy){                
                    var success = new Date().getTime()/2==1;
                    if(success){
                        deferredProxy.resolve("success");
                    }else{
                        deferredProxy.reject("fail");
                    }
                });

                deferred.done(fn1).fail(fn3);                

            });

 方式一:

 

相关文章

网站地图xml地图