1.Promise的含义
Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大。git
所谓Promise,简单说就是一个容器,里面保存着某个将来才会结束的事件 (一般是一个异步操做)的结果。从语法上说,Promise是一个对象,从它能够获取异步操做的消息。github
Promise对象有如下2个特色:
1.对象的状态不受外界影响。Promise对象表明一个异步操做,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其余手段没法改变。
2.一旦状态改变,就不会再变,任什么时候候均可以获得这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved;从Pending变为Rejected。只要这两种状况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象田静回调函数,也会当即获得这个结果。这与事件(Event)彻底不一样,事件的特色是,若是你错过了它,再去监听,是得不到结果的。编程
有了Promise对象,就能够把异步操做以同步操做的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供了统一的接口,使得控制异步操做更加容易。json
ES6规定,Promise对象是一个构造函数,用来生成Promise实例promise
var promise = new Promise(function(resolve,reject){ // ... some code if(/* 异步操做成功 */){ resolve(value); }else{ reject(error); } });
Promise构造函数接受一个函数做为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,又JavaScript引擎提供,不是本身部署。app
resolve函数的做用,将Promise对象的状态从“未完成”变成“成功”(即从Pending变为Resolved),在异步操做成功时调用,并将异步操做的结果,做为参数传递出去;
reject函数的做用是,在异步操做失败时调用,并将异步操做报出的错误,做为参数传递出去。异步
Promise实例生成之后,能够用then方法分别制定Resolved状态和Rejected状态的回调函数异步编程
promise.then(function(value){ // sucess },function(error){ // failure });
then
方法能够接受2个回调函数做为参数,第二个函数是可选的,不必定要提供。这两个函数都接受Promise对象传出的值做为参数。函数
下面是一个Promise对象的简单例子:post
function timeout(ms){ return new Promise((resolve,reject)=>{ setTimeout(resolve,ms,'done'); }); } timeout(100).then((value)=>{ console.log(value); });
上面代码中,timeout
方法返回一个Promise实例,表示一段事件之后才会发生的结果。过了指定的时间(ms
参数)之后,Promise实例的状态变为Resolved,就会触发then
方法绑定的回调函数。
Promise新建后就会当即执行
let promise = new Promise(function(resolve,rejeact){ console.log('Promise'); resolve(); }); promise.then(function(){ console.log('Resolved'); }); console.log('Hi'); // Promise // Hi // Resolved
上面代码中,Promise新建后当即执行,因此首先输出的是”Promise”,而后then
方法指定的回调函数,将在当前脚本全部同步任务执行完才会执行,因此”Resolved”最后输出。
下面是异步加载图片的例子:
function loadImageAsync(url){ return new Promise(function(resolve,reject){ var image = new Image(); image.onload = function(){ resolve(image); }; image.onerror = function(){ reject(new Error('Could not load image at' + url)); }; image.src = url; }); }
下面是一个用Promise对象实现Ajax操做的例子:
var getJSON = function(url){ var promise = new Promise(function(resolve,reject){ var client = new XMLHttpRequest(); client.open('GET',url); client.onreadystatechange = handler; client.responseType = 'json'; client.setRequestHeader('Accept','application/json'); client.send(); function handler(){ if(this.readyState !== 4){ return; } if(this.status === 200){ resolve(this.response); }else{ reject(new Error(this.statusText)); } } }); return promise; }; // getJSON('/posts.jons').then(function(json){ consoloe.log(json); },function(error){ console.log('出错了'); });