您好,登錄后才能下訂單哦!
最近在寫微信小程序,為了能用上 async/await 方法,需要把微信提供的異步操作包裝成 Promise 對象,為此寫了一個簡單的 promise(fie) 函數:
/** * @function promise - 將 wx 接口 promise 化 * * @param { String|Function } wxApi - 需要轉換的接口/接口名 * @param { Object|Any } [originParam = {}] - 原接口要求的參數對象 * @param { Object|Any } [extra] - 接口要求的其他參數 */ 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) ); }
正當我沾沾自喜、興致沖沖地調用拍照接口測試時,控制臺扔給我一個 “this._invokeMethod is not a Function” 的錯誤。顯而易見,由于 wxApi 被當做參數傳遞,執行時的 this 與預期不一致,因此需要顯式指定上下文,遂把函數再改改:
/** * @function promise - 將 wx 接口 promise 化 * * @param { String|Function } wxApi - 需要轉換的接口/接口名 * @param { Object|Any } [originParam = {}] - 原接口要求的參數對象 * @param { Object|Any } [context = wx] - 執行上下文 * @param { Object|Any } [extra] - 接口要求的其他參數 */ 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 方法在大多數情況下還是比較省事的。不過拍照接口是 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); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。