From 550533bfab03d3412ed04c2e43918705a6df234e Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Wed, 12 Dec 2018 15:17:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A1=B5=E9=9D=A2=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=97=B6=EF=BC=8CgetCurrentPages=20=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=88=B0=E4=B8=8A=E4=B8=AA=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/uni-mp-baidu/dist/index.js | 112 ++++++++++++++---- src/core/service/plugins/app/create-app.js | 14 ++- .../mp-baidu/service/api/protocols.js | 2 +- 3 files changed, 102 insertions(+), 26 deletions(-) diff --git a/packages/uni-mp-baidu/dist/index.js b/packages/uni-mp-baidu/dist/index.js index 99a5765b7..0f08319fc 100644 --- a/packages/uni-mp-baidu/dist/index.js +++ b/packages/uni-mp-baidu/dist/index.js @@ -112,68 +112,134 @@ function upx2px (number, newDeviceWidth) { return number } -var protocols = {}; +// 不支持的 API 列表 +const TODOS = [ + 'hideKeyboard' +]; + +// 需要做转换的 API 列表 +const protocols = { + request: { + args (fromArgs) { + // TODO + // data 不支持 ArrayBuffer + // method 不支持 TRACE, CONNECT + // dataType 可取值为 string/json + return fromArgs + } + }, + connectSocket: { + args: { + method: false + } + }, + previewImage: { + args: { + indicator: false, + loop: false + } + }, + getRecorderManager: { + returnValue: { + onFrameRecorded: false + // TODO start 方法的参数有差异,暂时没有提供配置处理。 + } + }, + getBackgroundAudioManager: { + returnValue: { + buffered: false, + webUrl: false, + protocol: false, + onPrev: false, + onNext: false + } + }, + createInnerAudioContext: { + returnValue: { + buffered: false + } + }, + createVideoContext: { + returnValue: { + playbackRate: false + } + }, + scanCode: { + onlyFromCamera: false, + scanType: false + } +}; + +TODOS.forEach(todoApi => { + protocols[todoApi] = false; +}); const CALLBACKS = ['success', 'fail', 'cancel', 'complete']; -function processCallback (method, returnValue) { +function processCallback (methodName, method, returnValue) { return function (res) { - return method(processReturnValue(res, returnValue)) + return method(processReturnValue(methodName, res, returnValue)) } } -function processArgs (fromArgs, argsOption = {}, returnValue = {}) { +function processArgs (methodName, fromArgs, argsOption = {}, returnValue = {}) { if (isPlainObject(fromArgs)) { // 一般 api 的参数解析 const toArgs = {}; + if (isFn(argsOption)) { + argsOption = argsOption(fromArgs, toArgs) || {}; + } Object.keys(fromArgs).forEach(key => { if (hasOwn(argsOption, key)) { let keyOption = argsOption[key]; if (isFn(keyOption)) { - keyOption = keyOption(fromArgs[key], fromArgs); + keyOption = keyOption(fromArgs[key], fromArgs, toArgs); } if (!keyOption) { // 不支持的参数 - console.warn(`${百度小程序} ${name}暂不支持${key}`); + console.warn(`百度小程序 ${methodName}暂不支持${key}`); } else if (isStr(keyOption)) { // 重写参数 key toArgs[keyOption] = fromArgs[key]; } else if (isPlainObject(keyOption)) { // {name:newName,value:value}可重新指定参数 key:value toArgs[keyOption.name ? keyOption.name : key] = keyOption.value; } } else if (CALLBACKS.includes(key)) { - toArgs[key] = processCallback(fromArgs[key], returnValue); + toArgs[key] = processCallback(methodName, fromArgs[key], returnValue); } else { toArgs[key] = fromArgs[key]; } }); return toArgs } else if (isFn(fromArgs)) { - fromArgs = processCallback(fromArgs, returnValue); + fromArgs = processCallback(methodName, fromArgs, returnValue); } return fromArgs } -function processReturnValue (res, returnValue) { - return processArgs(res, returnValue) +function processReturnValue (methodName, res, returnValue) { + if (isFn(protocols.returnValue)) { // 处理通用 returnValue + res = protocols.returnValue(methodName, res); + } + return processArgs(methodName, res, returnValue) } -function wrapper (name, method) { - if (hasOwn(protocols, name)) { - const protocol = protocols[name]; +function wrapper (methodName, method) { + if (hasOwn(protocols, methodName)) { + const protocol = protocols[methodName]; if (!protocol) { // 暂不支持的 api return function () { - throw new Error(`${百度小程序}暂不支持${name}`) + console.error(`百度小程序 暂不支持${methodName}`); } } - return function (arg1, arg2) { // 目前 api 最多两个参数 + return function (arg1, arg2) { // 目前 api 最多两个参数 let options = protocol; if (isFn(protocol)) { options = protocol(arg1); } - arg1 = processArgs(arg1, options.args, options.returnValue); + arg1 = processArgs(methodName, arg1, options.args, options.returnValue); - const returnValue = swan[options.name || name](arg1, arg2); - if (isSyncApi(name)) { // 同步 api - return processReturnValue(returnValue, options.returnValue) + const returnValue = swan[options.name || methodName](arg1, arg2); + if (isSyncApi(methodName)) { // 同步 api + return processReturnValue(methodName, returnValue, options.returnValue) } return returnValue } @@ -183,7 +249,7 @@ function wrapper (name, method) { const todoApis = Object.create(null); -const TODOS = [ +const TODOS$1 = [ 'subscribePush', 'unsubscribePush', 'onPush', @@ -204,7 +270,7 @@ function createTodoApi (name) { } } -TODOS.forEach(function (name) { +TODOS$1.forEach(function (name) { todoApis[name] = createTodoApi(name); }); @@ -265,7 +331,7 @@ if (typeof Proxy !== 'undefined') { if (todoApis[name]) { return promisify(name, todoApis[name]) } - if (!swan.hasOwnProperty(name)) { + if (!hasOwn(swan, name) && !hasOwn(protocols, name)) { return } return promisify(name, wrapper(name, swan[name])) @@ -287,7 +353,7 @@ if (typeof Proxy !== 'undefined') { }); Object.keys(swan).forEach(name => { - if (swan.hasOwnProperty(name)) { + if (hasOwn(swan, name) || hasOwn(protocols, name)) { uni$1[name] = promisify(name, wrapper(name, swan[name])); } }); diff --git a/src/core/service/plugins/app/create-app.js b/src/core/service/plugins/app/create-app.js index 17d0158dd..7aeb8f0e8 100644 --- a/src/core/service/plugins/app/create-app.js +++ b/src/core/service/plugins/app/create-app.js @@ -8,10 +8,11 @@ export function getApp () { export function getCurrentPages (isAll = false) { const pages = [] - const childrenVm = appVm.$children[0] + const app = getApp() + const childrenVm = app.$children[0] if (childrenVm && childrenVm.$children.length) { const tabBarVm = childrenVm.$children.find(vm => vm.$options.name === 'TabBar') - const app = getApp() + childrenVm.$children.forEach(vm => { if (tabBarVm !== vm && vm.$children.length && vm.$children[0].$options.name === 'Page' && vm.$children[0].$slots.page) { // vm.$children[0]=Page->PageBody->RealPage @@ -39,6 +40,15 @@ export function getCurrentPages (isAll = false) { } }) } + // 当页面返回过程中,请求 getCurrentPages 时,可能会获取到前一个已经准备销毁的 page + const length = pages.length + if (length > 1) { + const currentPage = pages[length - 1] + if (currentPage.$page.path !== app.$route.path) { // 删除已经准备销毁的上个页面 + pages.splice(length - 1, 1) + } + } + return pages } diff --git a/src/platforms/mp-baidu/service/api/protocols.js b/src/platforms/mp-baidu/service/api/protocols.js index bc5455633..10707f781 100644 --- a/src/platforms/mp-baidu/service/api/protocols.js +++ b/src/platforms/mp-baidu/service/api/protocols.js @@ -1,6 +1,6 @@ // 不支持的 API 列表 const TODOS = [ - 'hideKeyboard' + 'hideKeyboard' ] // 需要做转换的 API 列表 -- GitLab