install.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. /**
  2. * Promisify a callback function
  3. * @param {Function} fn callback function
  4. * @param {Object} caller caller
  5. * @param {String} type weapp-style|error-first, default to weapp-style
  6. * @return {Function} promisified function
  7. */
  8. const promisify = function(fn, caller, type = 'weapp-style') {
  9. return function(...args) {
  10. return new Promise((resolve, reject) => {
  11. switch (type) {
  12. case 'weapp-style':
  13. fn.call(caller, {
  14. ...args[0],
  15. ...{
  16. success(res) {
  17. resolve(res);
  18. },
  19. fail(err) {
  20. reject(err);
  21. }
  22. }
  23. });
  24. break;
  25. case 'weapp-fix':
  26. args = !args.length ? [{}] : args;
  27. fn.apply(caller, args.concat(resolve).concat(reject));
  28. break;
  29. case 'error-first':
  30. fn.apply(caller, [...args, (err, res) => (err ? reject(err) : resolve(res))]);
  31. break;
  32. }
  33. });
  34. };
  35. };
  36. // The methods no need to promisify
  37. const noPromiseMethods = [
  38. // 媒体
  39. 'stopRecord',
  40. 'getRecorderManager',
  41. 'pauseVoice',
  42. 'stopVoice',
  43. 'pauseBackgroundAudio',
  44. 'stopBackgroundAudio',
  45. 'getBackgroundAudioManager',
  46. 'createAudioContext',
  47. 'createInnerAudioContext',
  48. 'createVideoContext',
  49. 'createCameraContext',
  50. // 位置
  51. 'createMapContext',
  52. // 设备
  53. 'canIUse',
  54. 'startAccelerometer',
  55. 'stopAccelerometer',
  56. 'startCompass',
  57. 'stopCompass',
  58. 'onBLECharacteristicValueChange',
  59. 'onBLEConnectionStateChange',
  60. // 界面
  61. 'hideToast',
  62. 'hideLoading',
  63. 'showNavigationBarLoading',
  64. 'hideNavigationBarLoading',
  65. 'navigateBack',
  66. 'createAnimation',
  67. 'pageScrollTo',
  68. 'createSelectorQuery',
  69. 'createCanvasContext',
  70. 'createContext',
  71. 'drawCanvas',
  72. 'hideKeyboard',
  73. 'stopPullDownRefresh',
  74. // 拓展接口
  75. 'arrayBufferToBase64',
  76. 'base64ToArrayBuffer'
  77. ];
  78. const simplifyArgs = {
  79. // network
  80. request: 'url',
  81. downloadFile: 'url',
  82. connectSocket: 'url',
  83. sendSocketMessage: 'data',
  84. // media
  85. previewImage: 'urls',
  86. getImageInfo: 'src',
  87. saveImageToPhotosAlbum: 'filePath',
  88. playVoice: 'filePath',
  89. playBackgroundAudio: 'dataUrl',
  90. seekBackgroundAudio: 'position',
  91. saveVideoToPhotosAlbum: 'filePath',
  92. // files
  93. saveFile: 'tempFilePath',
  94. getFileInfo: 'filePath',
  95. getSavedFileInfo: 'filePath',
  96. removeSavedFile: 'filePath',
  97. openDocument: 'filePath',
  98. // device
  99. setStorage: 'key,data',
  100. getStorage: 'key',
  101. removeStorage: 'key',
  102. openLocation: 'latitude,longitude',
  103. makePhoneCall: 'phoneNumber',
  104. setClipboardData: 'data',
  105. getConnectedBluetoothDevices: 'services',
  106. createBLEConnection: 'deviceId',
  107. closeBLEConnection: 'deviceId',
  108. getBLEDeviceServices: 'deviceId',
  109. startBeaconDiscovery: 'uuids',
  110. setScreenBrightness: 'value',
  111. setKeepScreenOn: 'keepScreenOn',
  112. // screen
  113. showToast: 'title',
  114. showLoading: 'title,mask',
  115. showModal: 'title,content',
  116. showActionSheet: 'itemList,itemColor',
  117. setNavigationBarTitle: 'title',
  118. setNavigationBarColor: 'frontColor,backgroundColor',
  119. // tabBar
  120. setTabBarBadge: 'index,text',
  121. removeTabBarBadge: 'idnex',
  122. showTabBarRedDot: 'index',
  123. hideTabBarRedDot: 'index',
  124. showTabBar: 'animation',
  125. hideTabBar: 'animation',
  126. // topBar
  127. setTopBarText: 'text',
  128. // navigator
  129. navigateTo: 'url',
  130. redirectTo: 'url',
  131. navigateBack: 'delta',
  132. reLaunch: 'url',
  133. // pageScroll
  134. pageScrollTo: 'scrollTop,duration'
  135. };
  136. const makeObj = arr => {
  137. let obj = {};
  138. arr.forEach(v => (obj[v] = 1));
  139. return obj;
  140. };
  141. /*
  142. * wx basic api promisify
  143. * useage:
  144. * wepy.use(wepy-use-promisify)
  145. * wepy.use(wepy-use-promisify([nopromise1, nopromise2]));
  146. * wepy.use(wepy-use-promisify({nopromise1: true, promise: false}));
  147. * wepy.login().then().catch()
  148. */
  149. export default function install(wepy, removeFromPromisify) {
  150. let _wx = (wepy.wx = wepy.wx || Object.assign({}, wx));
  151. let noPromiseMap = {};
  152. if (removeFromPromisify) {
  153. if (Array.isArray(removeFromPromisify)) {
  154. noPromiseMap = makeObj(noPromiseMethods.concat(removeFromPromisify));
  155. } else {
  156. noPromiseMap = Object.assign({}, makeObj(noPromiseMethods), removeFromPromisify);
  157. }
  158. }
  159. Object.keys(_wx).forEach(key => {
  160. if (!noPromiseMap[key] && key.substr(0, 2) !== 'on' && key.substr(-4) !== 'Sync') {
  161. _wx[key] = promisify(
  162. function(...args) {
  163. let fixArgs = args[0];
  164. let failFn = args.pop();
  165. let successFn = args.pop();
  166. if (simplifyArgs[key] && Object.prototype.toString.call(fixArgs) !== '[object Object]') {
  167. fixArgs = {};
  168. let ps = simplifyArgs[key];
  169. if (args.length) {
  170. ps.split(',').forEach((p, i) => {
  171. if (i in args) {
  172. fixArgs[p] = args[i];
  173. }
  174. });
  175. }
  176. }
  177. fixArgs.success = successFn;
  178. fixArgs.fail = failFn;
  179. return wx[key].call(wx, fixArgs);
  180. },
  181. _wx,
  182. 'weapp-fix'
  183. );
  184. }
  185. });
  186. wepy.promisify = promisify;
  187. }