ES6 promise: http://es6.ruanyifeng.com/#docs/promise
首先用处:异步编程
老土的做法:异步代码块 回调 ,然后回调函数又是异步,异步里面嵌套回调函数。。。。由于缩进,代码结构上三角形,有人称“毁灭金字塔”,还有人称“ 回调地狱”
ES6 promise对象 4个状态 只有异步操作能改变 promise的状态
- pending: 还没有得到肯定或者失败结果,进行中
- fulfilled: 成功的操作
- rejected: 失败的操作
2个重要方法
then:将事务添加到事务队列中 resolve:开启流程,让整个操作从第一个事务开始执行
通常用法:
p=new Promise(function (resolve,reject) { dosome...异步操作 if("异步操作成功"){ resolve("回调参数") }else{ reject(error); } }) p.then( //接受2个回调函数 ,一个是success 另外一个是error function ('回调参数') { },function (err) { console.log("发生错误"+err) })
偷个栗子过来尝尝
var getJSON = function (url) { var promise = new Promise(function (resolve, reject) { //XMLHttpRequest 异步请求 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); //响应成功,通过resolve 改变状态,而且传响应参数给 //.then的成功回调函数 } else { reject(new Error(this.statusText)); //响应失败,通过reject改变状态 传参数 } }; }); return promise; }; getJSON("/posts.json").then(function (json) { //相当于实例化一个promise对象,封装状态信息 console.log('Contents: ' + json); }, function (error) { console.error('出错了', error); //失败的回调 });
var p1 = new Promise(function (resolve, reject) { // ... }); var p2 = new Promise(function (resolve, reject) { // ... resolve(p1); }) 一个异步操作的结果是返回另一个异步操作
Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch
语句捕获。
var p = Promise.all([p1, p2, p3]); Promise.all
方法接受一个数组作为参数,p1
、p2
、p3
都是Promise对象的实例,如果不是,就会先调用下面讲到的Promise.resolve
方法,将参数转为Promise实例,再进一步处理
Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo'))