<!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. innodb buffer pool flush机制

    参考印风的博客: FLUSH操作的类型,总的来说,有三种刷新类型   BUF_FLUSH_LRU:表示从Buffer Pool的LRU上扫描并刷新 BUF_FLUSH_LIST:表示从Buffer P ...

  2. Failed to read auto-increment value from storage engine, Error Number: 1467

    重设auto_increment:ALTER TABLE tableName auto_increment=number

  3. <mvc:annotation-driven />与<context:annotation-config />

    Spring家族的配置中这两个配置的意义,说具体点其实根据标签的shecma就能看出来,mvc,主要就是为了Spring MVC来用的,提供Controller请求转发,json自动转换等功能,而co ...

  4. 如何用javascript 的eval动态执行一个需要传对象参数的函数

    代码如下: var method = 'setRiskItemAmount_'+id[1]+'(id[0],id[2],this.value);'; console.log(method); eval ...

  5. PHP易混淆函数的区分

    常量定义自定义常量 常量名区分大小写系统的魔术常量不区分大小写 __DIR__ __dir__变量定义变量名是区分大小写变量名声明时用$符号开头, 而且要符合变量名的命名规则$i;var_dump($ ...

  6. Apache Mina 入门实例

    这个教程是介绍使用Mina搭建基础示例.这个教程内容是以创建一个时间服务器. 以下是这个教程需要准备的东西: MINA 2.0.7 Core JDK 1.5 或更高 SLF4J 1.3.0 或更高 L ...

  7. android19以上和以下uri转路径的方法

    android 19以上 /** * 专为Android4.4以上设计的从Uri获取文件路径 */ public static String getPath(final Context context ...

  8. rtc关机闹钟3 IAlarmManager

    vim framework/base/core/java/android/app/IAlarmManager.aidl import android.app.AlarmManager;import a ...

  9. 【转】JS 和 java 交互

    android中如何获得webView中的内容发表于 2011 年 06 月 13 日 由 admin本文概要:在程序中经常会用到webView来显示网页,但如果能够得到网页中的内容呢,本文将给你一个 ...

  10. python安装numpy科学计算模块

    解决两个问题: (1)Import Error: No module named numpy (2)Python version 2.7 required, which was not found i ...