思路分析
-
获取用户的收货地址
- 绑定点击事件
- 调用小程序内置api 获取用户的收货地址wx.chooseAddress
-
获取用户对小程序所授予获取地址的权限状态scope
- 当用户点击确定时 scope的值为true
- 直接调用获取收货地址api
- 当用户没有调用过获取收货地址的api scope的值为undefined
- 直接调用获取收货地址api
- 当用户点击取消时 scope的值为false,
- 诱导用户自己打开授权设置页面 当用户重新给予获取收货地址权限时
- 调用获取收货地址api
- 当用户点击确定时 scope的值为true
Page({
handleChooseAddress() {
wx.getSetting({
success: (result) => {
const scopeAddress = result.authSetting["scope.address"]
if (scopeAddress === true || scopeAddress === undefined) {
wx.chooseAddress({
success: (result1) => {
console.log(result1)
},
})
} else {
wx.openSetting({
success: (result2) => {
wx.chooseAddress({
success: (result3) => {
console.log(result3)
},
})
},
})
}
},
})
}
})
代码优化
async.js
// promise 形式的 getSetting
export const getSetting = ()=>{
return new Promise((resolve,reject)=>{
wx.getSetting({
success:(result)=>{
resolve(result)
},
fail:(err)=>{
reject(err)
}
})
})
}
// promise 形式的 chooseAddress
export const chooseAddress =()=>{
return new Promise((resolve,reject)=>{
wx.chooseAddress({
success:(result)=>{
resolve(result)
},
fail:(err)=>{
reject(err)
}
})
})
}
// promise 形式的 openSetting
export const openSetting = ()=>{
return new Promise((resolve,reject)=>{
wx.openSetting({
success:(result)=>{
resolve(result)
},
fail:(err)=>{
reject(err)
}
})
})
}
优化1
import {getSetting,chooseAddress,openSetting} from "async.js"
import regeneratorRuntime from '../../libs/runtime/runtime'
Page({
async handleChooseAddress() {
const res1 = await getSetting();
const scopeAddress = res1.authSetting["scope.address"]
if (scopeAddress === true || scopeAddress === undefined){
const res2 = await chooseAddress();
console.log(res2)
}else{
await openSetting();
const res3 = await chooseAddress();
console.log(res3)
}
}
})
优化2
import {getSetting,chooseAddress,openSetting} from "async.js"
import regeneratorRuntime from '../../libs/runtime/runtime'
Page({
async handleChooseAddress() {
const res1 = await getSetting();
const scopeAddress = res1.authSetting["scope.address"]
if (scopeAddress === false){
await openSetting();
}
const res2 = await chooseAddress();
console.log(res2)
}
})
优化3
import {getSetting,chooseAddress,openSetting} from "async.js"
import regeneratorRuntime from '../../libs/runtime/runtime'
Page({
async handleChooseAddress() {
try {
const res1 = await getSetting();
const scopeAddress = res1.authSetting["scope.address"]
if (scopeAddress === false) {
await openSetting();
}
const address = await chooseAddress();
// 把获取到的地址存到本地存储中
wx.setStorageSync("address",address)
} catch (err) {
console.log(err)
}
}
})