<!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. SQL Server系统表sysobjects介绍与使用

    关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器.你可 ...

  2. 为什么anylase和scenaio中的平均响应时间差别会这么大?

    场景里的响应时间截图如下所示: 结果里的响应时间截图如下所示:

  3. 给windows服务打包,并生成安装程序

    一. 添加新建项目-->安装部署-->安装项目 二.安装程序上-->右键视图-->文件系统-->应用程序文件夹-->右键-->添加项目输出 选择做好的wind ...

  4. 如何修改ECShop发货单查询显示个数

    使用ecshop的朋友都知道,商城首页调用的发货单查询,默认显示的10个.很多朋友想修改它的数量,可是在后台管理却找不到相应的地方,这个修改和显示排行榜的数量修改方法不一样.排行榜是可以在后台修改的, ...

  5. TreeView 读取 xml 显示节点

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Tree2_xml.aspx.c ...

  6. 如果在遨游浏览器里设置Bing(必应)搜索为默认搜索

    今天刚装了遨游浏览器,发现搜索引擎列表里没有Bing(必应)搜索的选项,就自己DIY了下. 步骤: 1. 在遨游搜索引擎列表管理里,添加一个新的搜索引擎项: Name:填写上”Bing(必应)“ (这 ...

  7. ACM Computer Factory

    ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6104 Accepted: 2113 ...

  8. 403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"问题

    问题1: 发布mvc3报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容 折腾了半天,提示里面的解决方法是: 如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. ...

  9. phpcms 01

    1 安装完成phpcms,然后打开2 C:\wamp\www\phpcms\templates 复制下面的default 目录,改名为ypzy2014 3 修改ypzy2014文件夹下的config配 ...

  10. ubuntu下安装花生壳

    下载地址:http://hsk.oray.com/download/#type=linux 官方的文档: 花生壳(公网版) for linux的安装以及使用 Linux花生壳(公网版)将大大简化大家的 ...