Promise 对象是ES6中的语法,主要是处理异步操作用的方法。
一 基本用法:
-
创建promose对象
var p = new Promise(function(resolve,reject){ // 异步操作写在函数体中 if(异步操作成功){ resolve(value) }else{ reject(value) } })
其实 就是构造函数创建实例化对象。其中,异步操作写在函数体中,
Promise 构造函数参数是一个函数,这个函数有两个参数,resolve,reject函数,这两个参数都是函数。
resolve() 函数是在异步操作执行成功后调用,resolve的参数是异步操作执行的结果。
reject()函数是异步操作执行失败时调用,参数是异步操作所报的错
2. promise 对象的回调函数
Promise.prototype.then()方法
大家一看也就清楚了,原型对象上定义的方法,then()方法有两个参数,第一个是resolve 对应的方法,第二个是reject 对应的方法(第二个参数可省略)
p.then(function(value){
console.log(value) // 异步操作执行成功后的回调即resolve()
},function(error){
console.log(error) // 异步操作执行失败后的回调即reject()
})
-
then 的链式语法
then方法返回的是一个新的Promise实例(注意,不是原来那个Promise实 例)。因此可以采用链式写法,即then方法后面再调用另一个then方法。p.then(function(value){ return 3 }).then(function(data){ console.log(data) //输出 3 })
为什么会输出3呢 答案是then 方法返回的都是promise对象,上面的式子相当于如下:(进行了转换)
p.then(function(value){
return new Promise(function(resolve,reject){resolve(3)})
}).then(function(data){
console.log(data) //输出 3
})
正常使用的时候,我们一般会这么写then方法每次都return 一个新promise 对象,然后下一个then是该新promise的方法,依次类推,但是注意:要实现链式语法,只有promise 对象才有then 方法。所以上一个必须是promise对象或上一个函数return 一个promise对象
p.then(function(value){
return new Promise(function(resolve,reject){resolve(3)})
}).then(function(data){
console.log(data) //输出 3
})
注意在then()的链式语法中,下一个then方法会等待上一个promise对象执行完毕,直到它是resolve还是reject 然后在调用自身中的第一个参数方法还是第二个参数方法
p.then(function(value){
return new Promise(function(resolve,reject){resolve(3)})
}).then(function(data){
console.log(data) //输出 3
},function(error){
console.log(error) // reject时调用该方法
})