Promise基本概念
Pormise是JS的异步编程的一种解决方案,在ES6将其写进了语言标准,提供了原生的Promise对象。
Promise简单来理解就是一个容器,里面存放着某个未来才会结束的事件结果。Promise是一个对象,从它可以获取异步操作的消息,Promise提供了统一的API,各种异步操作都可以用同样的方法进行处理。
Promise是个对象,有三种状态
- pending:进行中,在new Promise()的时候
- fulfilled:已成功,resolve会将进行中变成已成功
- rejected:已失败,reject会将进行中变成已失败
Promise使用
初始化的时候需要传递一个函数,这个函数有两个参数,两个参数也是函数。需要执行的异步代码放在传递的函数中
let promise = new Promise((resolve, reject) => { wx.getSystemInfo({ success: (res) => { // 修改成已成功的状态 resolve(res) }, fail: (err) => { // 修改成已失败的状态 reject(err) } }) }) promise.then((res) => { console.log(res) }, (err) => { console.log(err) })
promise.then()方法获取结果,接收两个参数,两个参数不可以更换位置
- 第一个是已成功的回调函数
- 第二个是已失败的回调函数
上面代码简写
new Promise((resolve, reject) => {
wx.getSystemInfo({
// 修改成已成功的状态
success: res => resolve(res),
// 修改成已失败的状态
fail: err => reject(err)
})
}).then(res => console.log(res), err => console.log(err))
Promise正确写法
如果出现几个Promise一起使用,则可以在Promise函数中return另外一个Promise对象,避免回调地狱。
bookModel.getHotList().then(res => {
console.log("1." + JSON.stringify(res))
// 如果需要在回调中发起另外的请求,则返回一个Promise
return bookModel.getMyBookCount()
}).then(res => {
console.log("2." + JSON.stringify(res))
return bookModel.getMyBookCount()
}).then(res => {
console.log("3." + JSON.stringify(res))
})
Promise.all使用
如果用三个请求发送,串行的
bookModel.getDetail(bid).then(res => {
this.setData({
book: res
})
})
bookModel.getCommons(bid).then(res => {
this.setData({
comments: res.comments
})
})
bookModel.getLikeStatus(bid).then(res => {
this.setData({
likeStatus: res.like_status,
likeCount: res.fav_nums
})
})
用Promise.all方法改写
Promise.all([bookModel.getDetail(bid), bookModel.getCommons(bid), bookModel.getLikeStatus(bid)]).then(res => {
wx.hideLoding()
this.setData({
book: res[0],
comments: res[1].comments,
likeStatus: res[2].like_status,
likeCount: res[2].fav_nums
})
})
res返回的是数组,数组的顺序就是all的参数数组的数据。