Promise 是异步编程的一种解决方案: 从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。 promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行
主要目的
- 解决回调地狱
- 支持多个并发的请求,获取并发请求中的数据
- 解决异步的问题(但是promise本身不是异步的,它的
.then
之类的回调函数是异步的)
promise
Es6 新增的引用类型,通过 new 来进行实例化,需要传入一个函数作为其参数
let p = new Promise(()=>{}) // 传入一个参数来当作形参
promise 状态
- pending:promise 刚创建时的状态,可以通过
resolve()
(成功的函数)和reject()
(失败的函数)来将状态进行转变 - fulfilled:执行
resolve()
后的状态无法再改变 - rejected:执行
reject()
后的状态,也无法改变
当状态改变后当前的 promise 对象就无法再次改变状态
只能通过 return Promise()
的方式再返回一个 pending 状态的 promise 对象
.then 的链式操作
p.then((data) => {
console.log(data);
})
.then((data) => {
console.log(data);
})
.then((data) => {
console.log(data);
});
resolve 和 reject
resolve()
:promise 执行成功调用的函数reject()
: 执行失败调用的函数
let p = new Promise((resolve, reject)=>{
resolve() // 成功执行的函数
reject() // 失败执行的函数
})
通过自己设置的条件来判断执行哪个函数
.then
.then 有两个参数onresolved
和onrejected
两个参数都是可选的,如果不加默认就执行成功的回调
如果想只执行失败 则需要再 onresolved 的位置传入一个 undefined
let p = new Promise()
p.then(()=>{
// 不添加表名只是成功的回调
})
.catch
.catch 和try{}catch(){}
里的.catch 用法一样,用来执行失败的回调
let p = new Promise()
p.then(()=>{
// 不添加表名只是成功的回调
}).catch(err){
console.log(err)
}
.all
可以用来合并多个请求,返回一个包含多个请求的数组
let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){})
let p = Promise.all([Promise1, Promise2, Promise3])
p.then(funciton(){
// 三个都成功则成功
}, function(){
// 只要有失败,则失败
})
.race
也是多个请求合并,但只有第一个请求回的数据会被返回
let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){})
let p = Promise.race([Promise1, Promise2, Promise3])
p.then(funciton(){
// 那个快执行哪个
}, function(){
// 只要有失败,则失败
})