Promise的实现原理
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的实现原理的更多相关文章
- Promise内部实现原理
promise内部实现原理: function $Promise(fn) { // Promise 的三种状态 this.PENDING = 'pending' this.RESOLVED = 're ...
- 160701、理解 Promise 的工作原理
Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...
- 160623、理解 Promise 的工作原理
Javascript 采用回调函数(callback)来处理异步编程.从同步编程到异步回调编程有一个适应的过程,但是如果出现多层回调嵌套,也就是我们常说的厄运的回调金字塔(Pyramid of Doo ...
- Promise.race 的原理
// race的原理 Promise.race = function(values){ return new Promise((resolve,reject)=>{ for(let i = 0 ...
- Promise.all 的原理
// all的原理 Promise.all = function(values){ return new Promise((resolve,reject)=>{ let results = [] ...
- JavaScript中Promise 使用、原理以及实现过程
1.什么是 Promise promise 是目前 JS 异步编程的主流解决方案,遵循 Promises/A+ 方案. 2.Promise 原理简析 (1)promise 本身相当于一个状态机,拥有三 ...
- promisify,promisifyAll,promise.all实现原理
1.promisify function toPrimisify (fn){ return function (...args){ return new Promise(function(r ...
- Promise原理—一步一步实现一个Promise
promise特点 一个promise的当前状态只能是pending.fulfilled和rejected三种之一.状态改变只能是pending到fulfilled或者pending到rejected ...
- promise原理
简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返 ...
随机推荐
- MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.1 A map with single layer
MapServer Tutorial——MapServer7.2.1教程学习——第一节用例实践:Example1.1 A map with single layer 一.前言 开始MapServer用 ...
- java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法
字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就 ...
- mongodb的db.collection is not function
mongodb的3.0版本之前: 如2.3版本,可以直接使用db调用collection来操作数据 但在3.0版本以上,会报错:db.collection is not a function 3.0版 ...
- springboot+thymeleaf+springbootJPA实现一个简单的增删改查
1.springboot是什么,给我们带来了什么方便? 通过阅读springboot的书籍发现springboot最便利的是为我们自动配置了很多的东西,几乎可以实现无xml,甚至简单的无sql,为我们 ...
- LAMP架构(二)
第十八次课 LAMP架构(二) 目录 一.Apache默认虚拟主机 二.Apache用户认证 三.域名跳转 四.Apache访问日志 五.访问日志不记录静态文件 六.访问日志切割 七.静态元素过期时间 ...
- 移动端H5拍照代码实现及外网部署
最近的工作中,遇到了一个需求:对于无APP登陆权限的人员,提供拍照上传功能,以便生成更完善的出工记录.经研究讨论,决定实现的机制为:由合法的人员登陆APP认领相关工作任务,并生成当天当工作的唯一二维码 ...
- ecmall 入口文件解析 引入了什么
每一个框架都有自动载入的工具库,搜了半天也没搜到相关介绍,就自己看入口文件琢磨了一下, <?php define('ROOT_PATH', dirname(__FILE__)); //定义项目根 ...
- 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。
问题描述:在VS中运行一个C#程序,出现错误: 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项.试 ...
- python socket 函数介绍
socket 函数原型:socket.socket([family[,type[,proto]]]) family参数取值(协议族): socket.AF_INET -->ipv4 ...
- 全志A33 lichee Linux内核原子操作(附实测代码)
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 原子操作是指不会被线程调度机 ...