Promise 并不只是一个单步执行操作的机制,我们可以把多个 Promise 连接到一起以表示一系列异步步骤。
这种链式流程的方式可以实现的关键在于以下两个 Promise 固有行为特性:
- 每次对 Promise 调用
then(..)
,它都会创建并返回一个新的 Promise,我们可以将其链接起来; - 不管从
then(..)
调用的完成回调返回值是什么,它都会被自动设置为被链接的 Promise(第一点中的)的完成回调返回值。
代码实现:
/**
* @method 打开地图获取地理位置
*/
function getCurrentLocation() {
// 初始化 promise
const initPromise = new Promise((resolve, reject) => {
// 获取用户授权信息
wx.getSetting({
success: res => resolve(res),
fail: err => reject(err)
})
})
return new Promise((resolveData, rejectData) => {
// 链式处理
initPromise
.then(res => {
if (res.authSetting['scope.userLocation'] !== undefined && !res.authSetting['scope.userLocation']) {
// 判断用户拒绝授权,则提示去开启授权
return new Promise((resolve, reject) => {
wx.showModel({
title: '温馨提示',
content: '请去设置中开启位置授权',
showCancel: false,
confirmText: '去设置',
success: res => {
if (res.confirm) {
// 打开微信设置
wx.openSetting({
success: res => {
if (res.authSetting['scope.userLocation']) {
// 授权成功则执行成功决议
resolve('位置授权设置成功')
} else {
reject('位置授权设置失败')
}
},
fail: err => reject(err)
})
}
}
})
})
} else if (!res.authSetting['scope.userLocation']) {
// 判断用户未授权,则向用户发起授权请求
return new Promise((resolve, reject) => {
wx.authorize({
scope: 'scope.userLocation',
// 允许授权则执行成功决议
success: res => resolve(res),
fail: err => reject(err)
})
})
} else {
// 判断用户已授权,则返回成功决议
return Promise.resolve()
}
})
.then(res => {
// 执行到这一步则表明用户已经授权
// 可以调用 API 获取位置信息
return new Promise((resolve, reject) => {
wx.getLocation({
success: res => resolve(res),
fail: err => reject(err)
})
})
})
.then(res => {
// 打开地图选择位置
return new Promise((resolve, reject) => {
wx.chooseLocation({
latitude: res.latitude,
longitude: res.longitude,
success: res => resolve(res),
fail: err => reject(err)
})
})
})
.then(res => {
// 拿到位置信息
console.log('location res: ', res)
resolveData(res)
})
.catch(err => {
// 错误处理
console.log('promise fail: ', err)
})
})
}