Javascript - Promise学习笔记

最近工做轻松了点,想起了之前老是看到的一个单词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/ ,请勿用于任何商业用途
相关文章
相关标签/搜索