<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>deferred对象</title>
    </head>
    <body>
        两个对象,一个是promise对象,另一个是deferred对象。
        Deferred方法,返回deferred对象。
        Deferred里面有then方法,返回promise对象。

        jQuery源码
        1.对参数做处理。
        处理的目的是,对不合法的参数,返回错误。
        对不同的参数类型,参数位置,做多态处理。
        2.常用&&或者||或者三目判断。
        3.常用typeof做判断。
        4.假设全部以正确方式来运行的态度,看代码。
        5.剔除源代码没必要的遍历,以最小集合来阅读。
    </body>
    <script src="../jquery-2.0.3.js"></script>
    <script>
        /*
             dfd.then(fn1)
            刚开始内部生成一个newDfd,
            先把fn1装饰一下变成fn1-1,
            再把fn1-1给dfd的函数队列。

            因为dfd内部的list是once memory了,
            所以fn1-1马上执行,内容如下:
            fn1返回fn1-promise,
            然后把newDfd的resolve函数给fn1-promise。

            dfd.then(fn1)最后返回一个newDfd的newPromise
            因为fn1-deferred已经resolve过了,
            所以又执行newDfd.resolve,
            接下来是下一个then了。
         */
        //  看代码,弄清空间和空间之间的运动关系,逻辑也就清晰了。
        //  分主次,首先把分枝减掉,留下主干,把主干搞清楚。
        function Deferred( func ) {
            var list = jQuery.Callbacks("once memory");
            var promise = {
                then: function() {
                    var fns = arguments;
                    var newDfd = Deferred(function( newDefer ) {
                            var fn = jQuery.isFunction( fns[ 0 ] ) && fns[ 0 ];
                            deferred[ "done" ](function() {
                                var returned = fn && fn.apply( this, arguments );
                                returned.promise().done( newDefer.resolve )
                            });
                        fns = null;
                    });
                    var newPromise = newDfd.promise();
                    return newPromise;
                },
                promise: function( obj ) {
                    return obj != null ? jQuery.extend( obj, promise ) : promise;
                },
                done: list.add
            },
            deferred = {
                resolve: function() {
                    deferred[ "resolveWith" ]( this === deferred ? promise : this, arguments );
                    return this;
                },
                resolveWith: list.fireWith,
                flag:"newDfd"
            };

            promise.promise( deferred );

            if ( func ) {
                func.call( deferred, deferred );
            }

            return deferred;
        }

        var dfd = Deferred();
        dfd.flag = "dfdflag";
        dfd.then(function(){
            var dfd1 = Deferred();
            dfd1.flag = "dfd1flag";
            alert(1);
            dfd1.resolve();

            return dfd1.promise();
        }).then(function(){
            var dfd2 = Deferred();
            alert(2);
            dfd2.resolve();
            return dfd2.promise();
        }).then(function(){
            var dfd3 = Deferred();
            alert(3);
            dfd2.resolve();
            return dfd2.promise();
        });

        dfd.resolve();

    </script>

</html>

其实jQuery的Deferred还是有bug的。

设想如下代码:

function(){
    var dfd = $.Deferred();
    dfd.resolve();
    $.ajax()

    return dfd.promise();
}

就算你提前resolve,ajax还是会执行。

jQuery的Deferred的更多相关文章

  1. jQuery之Deferred源码剖析

    一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...

  2. jQuery的deferred对象详解

    jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...

  3. jQuery的deferred对象学习

    #copy { background-color: lightgreen; padding: 15px; margin: 10px } 一.deferred对象简介 deferred对象是jquery ...

  4. jquery 之 Deferred 使用与实现

    观察者模式是开发中经常使用的模式,这个模式由两个主要部分组成:主题和观察者.通过观察者模式,实现主题和观察者的解耦. 主题负责发布内容,而观察者则接收主题发布的内容.通常情况下,观察者都是多个,所以, ...

  5. jQuery的deferred对象详解(转载)

    本文转载自: jQuery的deferred对象详解(转载)

  6. jQuery的deferred对象

    应用场景:处理异步任务 看到一篇阮一峰老师的博客挺好的讲的就是jQuery的deferred对象.坦诚讲之前没有怎么用过这个东东呢. 摘其中几点记录下 (1) $.Deferred() 生成一个def ...

  7. jQuery的deferred对象详解(一)

    最近一段时间,都在研究jquery里面的$.Deffered对象,几天都搞不明白,其中源码的运行机制,网上查找了相关的资料,<jQuery的deferred对象详解>阮一峰老师的文章,里面 ...

  8. jQuery的deferred对象解析

    参考: jQuery的deferred对象详解:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_defe ...

  9. [转] jQuery的deferred对象详解

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...

随机推荐

  1. obj.style.z-index的正确写法

    obj.style.z-index的正确写法 今天发现obj.style.z-index在js里面报错,后来才知道在js里应该把含"-"的字符写成驼峰式,例如obj.style.z ...

  2. 一个奇怪的MySQL错误返回

    (0, '') python查询结果,乍一看还以为是下标出错了 一番调试,发现是因为 mysql数据库连接关闭上出了错. 结尾 在对数据库进行操作的时候要注意连接的开启和关闭动作规范

  3. BZOJ3924 [Zjoi2015]幻想乡战略游戏

    Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...

  4. linux_过程问题记录

    常见问题1:-bash: rz: command not found 解决: 安装lrzsz: 解决命令:yum -y install lrzsz 常见问题2:linux 解压乱码 解决11.到htt ...

  5. 【Java学习笔记】数组使用

    package aaa; public class aaa { public static void main(String args[]) { int a[]={1,2,3,4}; for(int ...

  6. MVC控制器方法返回类型

    控制器公开控制器操作.操作是控制器上的方法,在浏览器的地址栏中输入特定 URL 时被调用.例如,假设要请求下面的 URL: http://localhost/Product/Index/3 在这种情况 ...

  7. String.format()【演示具体的例子来说明】

    String.format()[演示样例具体解释] 整理者:Vashon 前言: String.format 作为文本处理工具.为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 Strin ...

  8. 基于basys2驱动LCDQC12864B的verilog设计图片显示

    话不多说先上图 前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在 ...

  9. POJ1417 True Liars

    题意 Language:Default True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6392 Accep ...

  10. window系统更新导致很多服务出错

    window7,win10,window server各版本系统中,经常会出现下载完成更新补丁后要求重启更新,此时很可能会出现很多服务失效的莫名其妙的问题,比如数据库连不上,IIS某功能不好使等等问题 ...