promise里面接收一个参数,参数是函数。这个函数里面传入两个参数:resolve和reject,resolve是异步操做执行成功的回调函数,reject是异步操做执行失败的回调函数,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。
then方法是一个链式操做,用来分别指定成功和失败的回调函数,then方法能够接受两个参数,第一个对应resolve状态的回调,第二个对应reject状态的回调。Promise对象除了then方法,还有一个catch方法,用于指定发生错误时的回调函数,其实它和then的第二个参数同样,用来指定reject的回调。
区别:then 的第一个函数出错了,后面的catch能够捕获,写到then的第二个函数则捕获不到。es6
es6文档笔记:
promise表明一个异步操做,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。
状态一旦改变,就不会再变。pending 变为 fulfilled 和从 pending 变为 rejected。这两种状态发生,会称为resolved(已定型)。
为了行文方便,本章后面的resolved统一只指fulfilled状态,不包含rejected状态。
resolve 和 reject 由 JavaScript 引擎提供,不用本身部署。json
const promise=new Promise(function(resolve,reject){ if(异步操做成功){ resolve(value); }else{ reject(error); } });
resolve在异步操做成功时调用,并将异步操做的结果,做为参数传递出去。reject在异步操做失败的时候调用,并将异步操做报出的错误,做为参数传递出去。promise
Promise实例生成之后,能够用then方法分别指定resolved状态和rejected状态的回调函数。app
promise.then(function(value){ //success },function(error){ //failure });
举个例子:异步
function timeout(){ 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, reject) { console.log('Promise'); resolve(); }); promise.then(function() { console.log('resolved.'); }); console.log('Hi!'); // Promise // Hi! // resolved
上面代码中,Promise 新建后当即执行,因此首先输出的是Promise。而后,then方法指定的回调函数,将在当前脚本全部同步任务执行完才会执行,因此resolved最后输出。post
let promise = new Promise(function(resolve, reject) { console.log('Promise'); reject(); }); promise.then(function() { console.log('resolved.'); }); console.log('Hi!'); //Promise //Hi!
用promise实现一个Ajaxthis
const getJSON = function(url) { const promise = new Promise(function(resolve, reject){ const handler = function() { if (this.readyState !== 4) { return; } if (this.status === 200) { resolve(this.response); } else { reject(new Error(this.statusText)); } }; const client = new XMLHttpRequest(); client.open("GET", url); client.onreadystatechange = handler; client.responseType = "json"; client.setRequestHeader("Accept", "application/json"); client.send(); }); return promise; }; getJSON("/posts.json").then(function(json) { console.log('Contents: ' + json); }, function(error) { console.error('出错了', error); });
resolve函数的参数除了正常的值之外,还多是另外一个 Promise 实例,好比像下面这样。url
const p1 = new Promise(function (resolve, reject) { // ... }); const p2 = new Promise(function (resolve, reject) { // ... resolve(p1); })
then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实例)。所以能够采用链式写法,即then方法后面再调用另外一个then方法。code
应用:
图片加载:
const preLoadImage=function(path){ return new Promise(function(resolve,reject){ const image=new Image(); image.onload=resolve; image.onerror=reject; image.src=path; }); };