1.Promise 介绍

  Promise类似一个事务管理器,将用户异步操作流程用流水的形式来表达,用来延迟deferred和异步asynchronous. 特点如下:

 (1)对象的状态不受外界影响

    Promise对象有三种状态

    Pending     进行中

    Resolved   完成状态

    Rejected    失败状态

  只有异步操作的结果,可以决定当前是哪种状态,任何其他操作都无法改变这种状态

 (2)一旦状态改变,就不会再变,任何时候都可以得到这个结果

   状态改变: Pending—> Resolved  /  Pending —> Rejected

  事件的执行一旦错误,再去监听是得不到结果的。

(3)Promise 对象有两个重要方法,一个是then, 另一个是resolve

  then: 将事务流添加到事务队列中

  resolve:开启流程,让真个流程从第一个事务开始执行

 (4)Promise的常用方式如下:  

var p = new Promise(function(resolve, reject){

    …

    //处理事务

    resolve()

    ….

});

p.then(function(value){

    //处理成功

}, function(reason){

    //失败处理

}).always(function(){

    //总是会执行
});

当前Promise是ES6的一个重要特性,JQuery1.8以后也实现了Promise对象.

2.ES6的Promise

function helloWorld(flag){
return new Promise(function(resolve,reject){
if(flag){
resolve("Hello World!")
}else{
reject("Error")
}
});
} //helloWord方法返回一个new的Promise对象,Promise回调有两个参数分别处理成功和失败,不想处理的直接传入null即可 helloWorld(true).then(function(message){},function(error){});
helloWorld(true).then(function(message){}); //不处理失败

  每一个then 执行后,又返回一个Promise对象

  Promise.all 可以接收一个元素为 Promise 对象的数组作为参数,当这个数组里面所有的 Promise 对象都变为 resolve 时,该方法才会返回。结果为Promise对象结果集合。

Promise.all([promise1, promise2]).then(function (result) {

      console.log(result); // [“promise1Result”, “promise2result”]

}); 

  不管promise1执行快还是promise2执行快,promise.all会按照数组的吮吸返回结果。

  日常开发中经常会遇到这样的需求,在不同的接口请求数据然后拼合成自己所需的数据,通常这些接口之间没有关联(例如不需要前一个接口的数据作为后一个接口的参数),

这个时候 Promise.all 方法就可以派上用场了。

3.JQuery中的Promise实现:

  在jquery1.5之前传统的写法是

$.ajax({

   url:’/ServerResource.txt’,

   success: handlerSuccess function,

   error: handlerError function

});

//$.ajax返回一个XHR(XMLHttpRequest)对象,不能进行链式操作

  在jquery1.5之后,$.ajax 会返回$.Deferred对象,新的写法:

var promise = $.ajax({
url: "/ServerResource.txt"
});
 
promise.done(handlerSuccess);
promise.fail(handlerError);
promise.always(alwaysFunction);

  $.ajax() 会返回一个$.Deferred对象,执行完done, fail, always会返回一个新的$.Deferred对象,可以进行链式操作

  promise.done(handlerSuccess).fail(handlerError).always(alwaysFunction)

  $.Deferred对象的好处就是可以任意添加回调函数,就是可以出现多个.done()处理

promise.done(handlerSuccess1).done(handlerSuccess2).fail(handlerError).always(alwaysFunction) 

  另外一种产生链式调用的方式是利用Promise的 then 方法,它接受三个event handlers作为参数,

  在jquery 1.8之前,对于多个回调函数,有需要以数组方式传入三个参数:  

$.ajax({url: "/ServerResource.txt"})
.then([successFunction1, successFunction2, successFunction3],
[errorFunction1, errorFunction2]);
 
//same as
 
var jqxhr = $.ajax({
url: "/ServerResource.txt"
});
 
jqxhr.done(successFunction1);
jqxhr.done(successFunction2);
jqxhr.done(successFunction3);
jqxhr.fail(errorFunction1);
jqxhr.fail(errorFunction2); 

  1.8版本之后,then会返回一个新的Promise,它可以通过一个函数过滤掉Deferred对象的状态和值,用于取代不被推荐使用的 defeered.pipe() 方法。

$.ajax() 返回Promise对象,处理方式和ES6一致。

var promise = $.ajax({
url: "/ServerResource.txt"
});
 
promise.then(successFunction, errorFunction);
 
//如果不想处理某个事件类型,可以传入Null
var promise = $.ajax({
url: "/ServerResource.txt"
});
 
promise.then(successFunction); //no handler for the fail() event
then()方法还能逐次调用多个方法,可以用于处理有着先后顺序或者依赖的多个Ajax请求: var promise = $.ajax("/myServerScript1");
 
function getStuff() {
return $.ajax("/myServerScript2");
}
 
promise.then(getStuff).then(function(myServerScript2Data){ //第一个AJAX的response 作为第二个AJAX的入参
// Do something
});

Promise的实现原理的更多相关文章

  1. Promise内部实现原理

    promise内部实现原理: function $Promise(fn) { // Promise 的三种状态 this.PENDING = 'pending' this.RESOLVED = 're ...

  2. 160701、理解 Promise 的工作原理

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...

  3. 160623、理解 Promise 的工作原理

    Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...

  4. Promise.race 的原理

    // race的原理 Promise.race = function(values){ return new Promise((resolve,reject)=>{ for(let i = 0 ...

  5. Promise.all 的原理

    // all的原理 Promise.all = function(values){ return new Promise((resolve,reject)=>{ let results = [] ...

  6. JavaScript中Promise 使用、原理以及实现过程

    1.什么是 Promise promise 是目前 JS 异步编程的主流解决方案,遵循 Promises/A+ 方案. 2.Promise 原理简析 (1)promise 本身相当于一个状态机,拥有三 ...

  7. promisify,promisifyAll,promise.all实现原理

    1.promisify function toPrimisify (fn){ return function (...args){      return new Promise(function(r ...

  8. Promise原理—一步一步实现一个Promise

    promise特点 一个promise的当前状态只能是pending.fulfilled和rejected三种之一.状态改变只能是pending到fulfilled或者pending到rejected ...

  9. promise原理

      简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返 ...

随机推荐

  1. RABC --权限控制解读

    一.基于RBAC的概念介绍 1.RBAC(Role-Based Access Control )基于角色的访问控制. 2.RBAC认为权限的过程可以抽象概括为:判断[Who是否可以对What进行How ...

  2. inline元素、block元素、inline-block元素

    inline 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行,直到该行排满. block 块级元素:是可以控制宽和高.margin等,并且会换行.块级对象元素会单独占一行显示, ...

  3. 数据的双向绑定 Angular JS之开端篇

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  4. day_7

    r 读w 写a 追加写 f = open('s.txt',mode='r',encoding='utf-8') ff = f.readline() #读取时一行一行的时候末尾会跟着\nprint(ff ...

  5. 【Java集合系列一】ArrayList解析

    一.基础简介 1.ArrayList继承关系 2.底层用数组来存储数据,数据会在ArrayList创建的时候一并初始化.如果创建ArrayList的时候,没有设置容量,则会delay到第一次add数据 ...

  6. keras在win下的安装,使用等

    http://cache.baiducontent.com/c?m=9d78d513d99a16ef4fece42d4c01d6160e2482744cd7c7637ac3e34a84652b5637 ...

  7. C++ allocator

    C++ allocator http://www.cnblogs.com/wpcockroach/archive/2012/05/10/2493564.html 说一说C++里的allocator.我 ...

  8. sed语法2

    sed命令是一个面向字符流的非交互式编辑器,也就是说sed不允许用户与它进行交互操作.sed是按行来处理文本内容的.在shell中,使用sed来批量修改文本内容是非常方便的. sed命令的选项 sed ...

  9. 1458 Common Subsequence

    最简单的LIS; 设字符串为 a = acc  b = cc 则dp数组为 0 0 1 1 1 2 b[0] = a[1], b[1] = a[1] 防止这里算两个 要清楚的是 怎么不重复计算 也就是 ...

  10. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...