什么是Promise
Promise是由社区最早提出并实现的,后加入到es6规范中。为更好处理javascript异步问题,用于解决其多次异步回掉嵌套问题。下面先尝试下promise的基础用法吧。
创建promise实例
var promise = new Promise(function(resolve,reject){
if(flag){
resolve("成功了");
}else{
reject("失败了")
}
})
复制代码
解析上述代码:
- Promise是一个构造函数,它接收一个function(用excurator代替)作为参数
- 其内部规定其含有3种状态:
pedding(等待态): 在创建实例后,到未调用resolve和reject前都属于pedding态。 success(完成态--成功): 调用resolve(data)后处于成功态 error(完成态--失败): 调用reject(data)后处于失败态
- promise成完成态后,其状态不会再发生变化
- excurator可接收2个形参(resolve,reject),其都可接收1个形参,后期会传入到then方法中。 resolve(data)后promise为success态。reject(data)后promise变为error态
promise.then方法
promise.then(function(data){
console.log(data) //==>成功了 data指的是resolve传过来的值
return 100;
},function(e){
console.log(e) //==>失败了 e指的是reject传过来的值
}).then(function(data){ // ==> 链式调用
console.log(data) // 100
},function(e){
})
复制代码
解析上述代码:
- promise.then(fun1,fun2)在调用时,若promise的状态变为success时会调用fun1其接收resolve传入的data,状态变为error会调用fun2接收reject传入的失败原因
- promise的链式调用实现:then方法在调用后通过内部机制返回一个新的promise来实现。
- then链式调用时,第一种:上一个then的fun中有报错,会进入当前then的错误中。第二种:上一个then的fun中有返回值,则直接进入当前then的正确逻辑中。第三种:若上一个then未有正确或错误处理,则其接收值将会穿透,进入当前then中处理
promise.catch(function(e){...})
等同于promise.then(null,function(e){...}),若前面then中没有错误处理,则统一进入此方法
let promise = new Promise(function(resolve,reject){...})
promise.catch(function(data){
})
复制代码
promise.finally(function(){})
不管 Promise 对象最后状态如何,都会执行的操作
let promise = new Promise(function(resolve,reject){...})
promise.then(...).finally(function(){
})
复制代码
let p = Promise.all([p1,p2...])
p1,p2指promise实例,在p1,p2...所有状态都为成功时,p的状态才为成功,任何一个失败,即为失败
Promise.all([p1,p2,p3]]).then(function (lists) {
// ... lists是一个数组,其结果和[p1,p2,p3]的返回值一一对应
}).catch(function(reason){
// ...
});
复制代码
let p = Promise.race([p1,p2...])
p1,p2指promise实例,其任何一个状态改变即会进入p的then方法中去
Promise.race([p1,p2,p3]]).then(function (data) {
// ... data为先返回结果的promise的返回值
}).catch(function(reason){
// ...
});
复制代码
let p = Promise.resolve(param) // Promise.reject(param)
两个方法类似,分别会进入后期的then中的正确/异常处理逻辑中去。其参数param会在内部判断,然后进入不同处理。以resolve方法为例如下
- param为promise实例。则直接进入promise的调的resolve方法
- param为thenable 对象,直接原封返回thenable对象的resolve对象
- 其它值,则直接将对象作为成功原因,返回
//param为promise实例
Promise.resolve(new Promise(function(resolve,reject){
resolve("params的promise成功了")
})).then(function(data){
console.log(data) // params的promise成功了
})
//param为thenable对象
Promise.resolve({
then: function(resolve, reject) {
resolve('成功了');
}
}).then(function(value) {
console.log(value); // 成功了
});
//param为其它对象
Promise.resolve(100).then(fucntion(data){
console.log(data) // 100
})
复制代码