最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下。
 
一:Promise是什么?为什么会有这个东西?
首先说明,Promise是为了解决javascript异步编程时候代码书写的方式产生的。
随着javascript的发展,异步的场景越来越多。前端有AJAX,setTimeout等,后端Node异步更多。按照传统的做法,那么就是各种回调嵌回调。代码可以把人绕晕。
这个时候,CommonJS社区提出了一个叫做Promise/A+的规范,这个规范定义了如何书写异步代码,包括使用when/then/resolve等来组织异步的代码。
这个规范由于很优雅,所以相继就有很多人实现了这个规范,其中包括 浏览器原生支持的Promise(), jQuery里面的deferred,when.js等。
因为这几个库都符合该规范,所以学习一个也就可以了。我主要学习了jQuery的deferred,所以本文主要讲讲这个实现。
 
二:jQuery的deferred
首先,关于deferred对象,阮一峰老师有篇文章写的很详细了,地址点这。建议可以先看看他的那篇文章,再继续往下看。
上面说过,promise是为了解决异步(比如ajax)的,那么我们来对比下他们的区别。
经典的jQuery的AJAX的写法是
$.ajax({
type: "get",
url: "",
success: function () {},
error; function () {}
});
其中success和error参数便是成功/失败时候的回调函数。
 
而现在jQuery的AJAX写法成了
$.ajax({
type; "get",
url: ""
}).done(function () {}).fail(function () {});
其中成功后会调用done里面的函数,失败便会调用fail里面的函数。
 
看到这里也许你就会有疑问了,done/fail这些方法是哪个对象上的?$.ajax()返回了什么对象,为什么有这两个方法?
答案就在下面介绍的Deferred对象。
 
jQuery提供了一种新的类型Deferred。通过$.Deferred()来生成。例如
var def = $.Deferred();
这个def继承了很多方法,有done/fail/resolve/reject等。
所以这里我们也就知道,上面$.ajax()其实返回的也就是这个对象。
 
deferred对象有很多方法,这里介绍几种常用的,更多的可以参考 API
 
首先自然是生成一个def对象。这里有很多方法,比如:
var def = $.Deferred();    // 自己生成
$.ajax({}); // ajax方法返回的也是def对象
$.when(); // when方法也会返回一个def对象
这里,$.when()可以单独讲讲,这个方法通常接收一个或多个deferred对象,然后根据这些deferred对象的状态情况,来决定$.when()返回的对象的状态。其中有个使用场景就是多个ajax请求,如果其中一个失败就都算失败,那么便可以在$.when()中传入多个ajax方法,例如$.when($.ajax(), $.ajax())。然后$.when会返回一个def对象(根据这两个请求结果的来判断)。
 
接着得到了def对象,便有了一系列改变这个对象状态的方法
def.resolve();    // 把def对象设置成已经完成,然后便会立刻执行绑定在def.done()里面的函数。
def.reject(); // 把def对象设置成已经失败,然后便会立刻执行绑定在def.fail()里面的函数。
def.notify(); // def对象执行中,对应的回调是def.progress()。
紧接着是设置回调的方法,顺序和上面的对应,也就是什么状态会调用到什么回调
def.done();    // 对应def.resolve();
def.fail(); // 对应def.reject();
def.progress(); // 对应 def.notify(); // 特殊的
def.always(); // 成功或者失败都会调用
def.then(); // 接受多个函数,按顺序依次是成功(done),失败(fail)和进行中(progress)
其实到这里位置,deferred对象的用法也就差不多了。不过jQuery还提供了几个API
// 检查当前状态类
def.isRejected();
def.isResolved();
def.state();
这几个api顾名思义,就不具体讲了,具体可以查看上面给的jQuery API文档。
 
还有一个方法,就是有时候我们希望给外部一个def对象,然后这个对象可以设置各种状态的回调,但是不能改变它的状态,那么就可以用
def.promise();
返回一个promiese对象,是deferred对象的子集,可以用done/fail等方法,没有resolve/reject等方法,主要是为了保护不让外部去修改def对象的状态。
 
至此,关于promise已经全部讲完,大家现在就可以把它用在自己的项目中了,另外提早给大家拜个早年,祝大家羊年洋洋得意^ ^。
 
 
 
转载本站文章请注明作者和出处 奇葩一朵朵 – http://www.cnblogs.com/season-huang/ ,请勿用于任何商业用途

Javascript - Promise学习笔记的更多相关文章

  1. Javascript Promise 学习笔记

    1.     定义:Promise是抽象异步处理对象以及对其进行各种操作的组件,它把异步处理对象和异步处理规则采用统一的接口进行规范化. 2.     ES6 Promises 标准中定义的API: ...

  2. JavaScript正则表达式学习笔记(二) - 打怪升级

    本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...

  3. javascript正则表达式 - 学习笔记

    JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...

  4. JavaScript简易学习笔记

    学习地址:http://www.w3school.com.cn/js/index.asp 文字版: https://github.com/songzhenhua/github/blob/master/ ...

  5. javaScript 对象学习笔记

    javaScript 对象学习笔记 关于对象,这对我们软件工程到学生来说是不陌生的. 因为这个内容是在过年学到,事儿多,断断续续,总感觉有一丝不顺畅,但总结还是要写一下的 JavaScript 对象 ...

  6. JavaScript之Promise学习笔记

    一直想知道Promise到底是怎么实现的,网上一搜几十篇文章,看的一脸蒙蔽.最后算是找到几个讲的真心很详细明了的.看了一份源码看了很久很久……最后找大佬问了几处看不懂的地方,大佬只看了十几分钟就看懂了 ...

  7. Promise 学习笔记 - 时间支配者

    本文同步自我的个人博客:http://www.52cik.com/2015/11/08/promise.html JavaScript 的 promises 事实标准称为 Promises/A+.ES ...

  8. 【MarkMark学习笔记学习笔记】javascript/js 学习笔记

    1.0, 概述.JavaScript是ECMAScript的实现之一 2.0,在HTML中使用JavaScript. 2.1 3.0,基本概念 3.1,ECMAScript中的一切(变量,函数名,操作 ...

  9. Javascript MVC 学习笔记(一) 模型和数据

    写在前面 近期在看<MVC的Javascript富应用开发>一书.本来是抱着一口气读完的想法去看的.结果才看了一点就傻眼了:太多不懂的地方了. 仅仅好看一点查一点,一点一点往下看吧,进度虽 ...

随机推荐

  1. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  2. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  3. Java初始化过程

    这篇文章主要讲解Java在创建对象的时候,初始化的顺序.主要从以下几个例子中讲解: 继承关系中初始化顺序 初始化块与构造器的顺序 已经加载过的类的初始化顺序 加载父类,会不会加载子类 创建子类对象会不 ...

  4. HTML5 语义元素(二)文本内容

    上一篇介绍的是关于页面结构方面的语义元素,本篇介绍文本内容方面,包含:<bdi>.<details>.<summary>.<mark>.<outp ...

  5. [APUE]系统数据文件与信息

    一.口令文件 UNIX口令文件包含下表中的各个字段,这些字段包含在 由于历史原因,口令文件是/bin/passwd,而且是一个文本文件,每一行都包括了上表中的七个字段,字段之间用":&quo ...

  6. 初探Vue

    Vue.js(读音/vju:/,类似于view),是近来比较火的前端框架,但一直没有怎么具体了解.实现过,就知道个啥的MVVM啦,数据驱动啦,等这些关于Vue的虚概念. 由于最近,小生在公司中,负责开 ...

  7. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  8. spring源码分析之context

    重点类: 1.ApplicationContext是核心接口,它为一个应用提供了环境配置.当应用在运行时ApplicationContext是只读的,但你可以在该接口的实现中来支持reload功能. ...

  9. 关于CSS inline-block、BFC以及外边距合并的几个小问题

    CSS inline-block和BCF对于初学者来说,总是弄不太明白,下面记录下我在学习这块知识的过程中遇到的几个问题,供大家参考,有不足的地方,欢迎大家批评指正. 一.在什么场景下会出现外边距合并 ...

  10. 一个软件开发者的BPM之路

    我是小林,一名普通的软件工程师,从事BPM(业务流程管理)软件开发工作.我没有几十年的技术底蕴,无法像大牛们一样高谈阔论,品评BPM开发之道:也不是资深的流程管理专家,能与大家分析流程管理的时弊.我只 ...