詳解微信小程序 同步異步解決辦法
詳解微信小程序 同步異步解決辦法
小程序中函數(shù)體還沒有完成,下一個(gè)函數(shù)就開始執(zhí)行了,而且兩個(gè)函數(shù)之間需要傳參。那是因?yàn)槲⑿判〕绦蚝瘮?shù)是異步執(zhí)行的。但微信小程序增加了ES6的promise特性支持,微信小程序新版本中移除了promise的支持,需要自己使用第三方庫(kù)來自行實(shí)現(xiàn)ES6的promise特性。
WxService.js
import Tools from 'Tools'
import es6 from '../assets/plugins/es6-promise'
class Service {
constructor() {
this.__init()
}
/**
* __init
*/
__init() {
this.tools = new Tools
this.__initDefaults()
this.__initMethods()
}
/**
* __initDefaults
*/
__initDefaults() {
// 緩存非異步方法
this.noPromiseMethods = [
'stopRecord',
'pauseVoice',
'stopVoice',
'pauseBackgroundAudio',
'stopBackgroundAudio',
'showNavigationBarLoading',
'hideNavigationBarLoading',
'createAnimation',
'createContext',
'hideKeyboard',
'stopPullDownRefresh',
]
// 緩存wx接口方法名
this.instanceSource = {
method: Object.keys(wx)
}
}
/**
* 遍歷wx方法對(duì)象,判斷是否為異步方法,是則構(gòu)造promise
*/
__initMethods() {
for (let key in this.instanceSource) {
this.instanceSource[key].forEach((method, index) => {
this[method] = (...args) => {
// 判斷是否為非異步方法或以 wx.on 開頭,或以 Sync 結(jié)尾的方法
if (this.noPromiseMethods.indexOf(method) !== -1 || method.substr(0, 2) === 'on' || /\w+Sync$/.test(method)) {
return wx[method](...args)
}
return this.__defaultRequest(method, ...args)
}
})
}
/**
* 保留當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面
* @param {String} url 路徑
* @param {Object} params 參數(shù)
*/
this.navigateTo = (url, params) => {
const $$url = this.tools.buildUrl(url, params)
return new es6.Promise((resolve, reject) => {
wx.navigateTo({
url: $$url,
success: res => resolve(res),
fail: res => reject(res),
})
})
}
/**
* 關(guān)閉當(dāng)前頁(yè)面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個(gè)頁(yè)面
* @param {String} url 路徑
* @param {Object} params 參數(shù)
*/
this.redirectTo = (url, params) => {
const $$url = this.tools.buildUrl(url, params)
return new es6.Promise((resolve, reject) => {
wx.redirectTo({
url: $$url,
success: res => resolve(res),
fail: res => reject(res),
})
})
}
}
/**
* 以wx下API作為底層方法
* @param {String} method 方法名
* @param {Object} obj 接收參數(shù)
*/
__defaultRequest(method = '', obj = {}) {
return new es6.Promise((resolve, reject) => {
obj.success = (res) => resolve(res)
obj.fail = (res) => reject(res)
wx[method](obj)
})
}
}
export default Service
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 微信小程序中使用Async-await方法異步請(qǐng)求變?yōu)橥秸?qǐng)求方法
- 詳解將微信小程序接口Promise化并使用async函數(shù)
- 微信小程序 緩存(本地緩存、異步緩存、同步緩存)詳解
- 微信小程序異步處理詳解
- 微信小程序 wx.request方法的異步封裝實(shí)例詳解
- 微信小程序onLaunch異步,首頁(yè)onLoad先執(zhí)行?
- 微信小程序中使用ECharts 異步加載數(shù)據(jù)的方法
- 微信小程序之支付后調(diào)用SDK的異步通知及驗(yàn)證處理訂單方法
- 微信小程序中使用Promise進(jìn)行異步流程處理的實(shí)例詳解
- 微信小程序 es6-promise.js封裝請(qǐng)求與處理異步進(jìn)程
- 微信小程序利用co處理異步流程的方法教程
- 微信小程序中使用 async/await的方法實(shí)例分析
相關(guān)文章
SpringBoot啟動(dòng)yaml報(bào)錯(cuò)的解決
這篇文章主要介紹了SpringBoot啟動(dòng)yaml報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
一文徹底弄懂spring?boot自動(dòng)配置的過程(推薦)
SpringBoot的自動(dòng)配置機(jī)制通過@SpringBootApplication注解作為起點(diǎn),結(jié)合@EnableAutoConfiguration和spring.factories文件,實(shí)現(xiàn)了基于類路徑依賴、環(huán)境配置和自定義代碼的智能化配置,感興趣的朋友跟隨小編一起看看吧2024-10-10
springboot使用alibaba的druid數(shù)據(jù)庫(kù)連接池錯(cuò)誤的問題及解決
這篇文章主要介紹了springboot使用alibaba的druid數(shù)據(jù)庫(kù)連接池錯(cuò)誤的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
SpringMVC 中HttpMessageConverter簡(jiǎn)介和Http請(qǐng)求415 的問題
本文介紹且記錄如何解決在SpringMVC 中遇到415 Unsupported Media Type 的問題,并且順便介紹Spring MVC的HTTP請(qǐng)求信息轉(zhuǎn)換器HttpMessageConverter2016-07-07
springboot+idea熱部署的實(shí)現(xiàn)方法(自動(dòng)刷新)
這篇文章主要介紹了springboot+idea熱部署的實(shí)現(xiàn)方法(自動(dòng)刷新),本文分步驟通過實(shí)例代碼截圖相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05

