小程序接口的promise化的實現(xiàn)方法
最近在寫微信小程序,為了能用上 async/await 方法,需要把微信提供的異步操作包裝成 Promise 對象,為此寫了一個簡單的 promise(fie) 函數(shù):
/** * @function promise - 將 wx 接口 promise 化 * * @param { String|Function } wxApi - 需要轉(zhuǎn)換的接口/接口名 * @param { Object|Any } [originParam = {}] - 原接口要求的參數(shù)對象 * @param { Object|Any } [extra] - 接口要求的其他參數(shù) */ function promise(wxApi, originParam = {}, extra){ const api = wxApi instanceof Function? wxApi: wx[wxApi]; return new Promise((done, fail) => api(Object.assign( originParam, { success: done, failed: fail } ), extra) ); }
正當我沾沾自喜、興致沖沖地調(diào)用拍照接口測試時,控制臺扔給我一個 “this._invokeMethod is not a Function” 的錯誤。顯而易見,由于 wxApi 被當做參數(shù)傳遞,執(zhí)行時的 this 與預期不一致,因此需要顯式指定上下文,遂把函數(shù)再改改:
/** * @function promise - 將 wx 接口 promise 化 * * @param { String|Function } wxApi - 需要轉(zhuǎn)換的接口/接口名 * @param { Object|Any } [originParam = {}] - 原接口要求的參數(shù)對象 * @param { Object|Any } [context = wx] - 執(zhí)行上下文 * @param { Object|Any } [extra] - 接口要求的其他參數(shù) */ function promise(wxApi, originParam = {}, context = wx, extra){ const api = wxApi instanceof Function? wxApi: context[wxApi]; return new Promise((done, fail) => api.call(context, Object.assign( originParam, { success: done, failed: fail } ), extra) ); }
由于大部分接口都是 wx 的方法,因此這個 promise 方法在大多數(shù)情況下還是比較省事的。不過拍照接口是 cameraContext 的方法,所以傳遞的是 createCameraContext 方法的返回值:
/** * @function takePhoto - promise風格的拍照接口 * * @param { Object|Any } [options = {}] - 相機配置 * * @return {Promise} */ export function takePhoto(options = {}){ const tempOptions = { quality: 'high', ...options } const cameraContext = createCameraContext(); return promise(cameraContext.takePhoto, tempOptions, cameraContext); }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javaScript 動態(tài)訪問JSon元素示例代碼
訪問JSon元素的方法有很多,在搜的時候會找到很多,本文使用javascript來動態(tài)訪問json元素,感興趣的朋友可以練練手哦2013-08-08WebStorm中如何將自己的代碼上傳到github示例詳解
這篇文章主要介紹了WebStorm中如何將自己的代碼上傳到github,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10結(jié)合?ES6?類編寫JavaScript?創(chuàng)建型模式
這篇文章主要介紹了結(jié)合ES6類編寫JavaScript創(chuàng)建型模式,本文開始系統(tǒng)性的對20多種JavaScript?設(shè)計模式進行簡單概述,然后結(jié)合ES6類的方式來編寫實例代碼展示其使用方式,需要的朋友可以參考一下2022-07-07JavaScript內(nèi)置日期、時間格式化時間實例代碼
JS中的 Date 對象用于處理日期和時間,Date對象和Math對象不一樣,Date是一個構(gòu)造函數(shù),需要實例化后才能使用對象中具體的方法和屬性。這篇文章主要給大家介紹了關(guān)于JavaScript內(nèi)置日期、時間格式化時間的相關(guān)資料,需要的朋友可以參考下2021-05-05JS Promise axios 請求結(jié)果后面的.then() 是什么意思
本文主要介紹了JS Promise axios 請求結(jié)果后面的 .then() 是什么意思,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01