jQuery的Deferred

<!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>
时间: 2025-01-24 04:55:45

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

jQuery的deferred对象

今天学习jQuery API的时候看到deferred部分,以前也没有接触使用过,看的毫无头绪,于是找资料学习了一番. deferred对象代表了将要完成的某种操作,并提供了一些方法,帮助用户使用.它是jQuery对Promises接口的实现.由于JavaScript单线程的特点,如果某个操作耗时很长,其他操作就必需排队等待.为了避免整个程序失去响应,通常的解决方法是将那些排在后面的操作,写成“回调函数”(callback)的形式.这样做虽然可以解决问题,但是有一些显著缺点: 回调函数往往写成函

jQuery之Deferred对象

Deferred对象是由$.Deferred构造的,$.Deferred被实现为简单工厂模式. 它用来解决JS中的异步编程,它遵循 Common Promise/A 规范.实现此规范的还有 when.js 和 dojo. $.Deferred作为新特性首次出现在版本1.5中,这个版本利用Deferred又完全重写了Ajax模块. $.Deferred在jQuery代码自身四处被使用,分别是promise方法.DOM ready.Ajax模块.动画模块. 这里以版本1.8.3分析,由于1.7后$.

jQuery的deferred对象详解(转)

jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax.为了实现它,jQuery的全部ajax代码都被改写了.但是,它比较抽象,初学者很难掌握,网上的教程也不多.所以,我把自己的学习笔记整理出来了,希望对大家有用. 本文不是初级教程,针对的读者是那些已经具备

jQuery之Deferred源码剖析

一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样,通过链式调用,避免层层嵌套,如下: //jquery版本大于1.8 function runAsync(){ var def = $.Deferred(); setTimeout(function(){ console.log('I am done'); def.resolve('whatever'

jquery 之 Deferred 使用与实现

观察者模式是开发中经常使用的模式,这个模式由两个主要部分组成:主题和观察者.通过观察者模式,实现主题和观察者的解耦. 主题负责发布内容,而观察者则接收主题发布的内容.通常情况下,观察者都是多个,所以,我们需要一个集合来保存所有的观察者,在主题发布内容之后,依次将主题发布的内容提供给观察者,从程序的角度来说,观察者就是一堆的方法,我们将内容作为参数依次调用这些方法. 如果你已经看过上一篇 jQuery 之 Callbacks, 那么,你会发现,通过 Callbacks 来管理观察者的列表是很方便的

jQuery的deferred对象详解(转)

jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. 这个功能很重要,未来将成为jQuery的核心方法,它彻底改变了如何在jQuery中使用ajax.为了实现它,jQuery的全部ajax代码都被改写了.但是,它比较抽象,初学者很难掌握,网上的教程也不多.所以,我把自己的学习笔记整理出来了,希望对大家有用. 本文不是初级教程,针对的读者是那些已经具备

jQuery的deferred对象详解(二)

Deferred对象是由$.Deferred构造的,$.Deferred被实现为简单的工厂模式. $.Deferred的实现 创建三个$.Callbacks对象,分别表示成功done,失败fail,处理中process三种状态 对应了三种处理结果,resolve.reject.notify 创建了一个promise对象,具有state.always.then.primise方法 通过扩展primise对象生成最终的Deferred对象,是阻止其他代码来改变这个deferred对象的状态,defe

jQuery的deferred对象详解(一)

最近一段时间,都在研究jquery里面的$.Deffered对象,几天都搞不明白,其中源码的运行机制,网上查找了相关的资料,<jQuery的deferred对象详解>阮一峰老师的文章,里面阐述deferred讲的非常清楚,也让我大彻大悟,为了以后能很好的查阅,现将阮老师的文字转载过来. 一.什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作.其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即

谈谈JQuery的Deferred对象

最近一个变态的项目,一个页面只含编辑器且有下载功能,大概含20个左右接口,要求数据完整显示(很多echarts图),弄个等待圈圈等它loading,启用jQuery的Deferred延迟对象,再多的接口也不怕了.(之前没有用过Deferred对象,姑且谈谈吧) $.ajax(),低于1.5.0版本的jQuery,返回的是XHR对象,高于1.5.0版本jQuery,返回的是Deferred对象. $.when(),when通常执行0个或多个异步事件的Deferred延迟对象的回调函数: 当参数为多