diff --git a/packages/taro-platform-harmony-hybrid/build/config/harmony-definition.json b/packages/taro-platform-harmony-hybrid/build/config/harmony-definition.json index 671d0b834da1..09255dddc6d6 100644 --- a/packages/taro-platform-harmony-hybrid/build/config/harmony-definition.json +++ b/packages/taro-platform-harmony-hybrid/build/config/harmony-definition.json @@ -1178,7 +1178,7 @@ } }, "getTopStatus": false, - "getUpdateManager": false, + "getUpdateManager": true, "getUserCryptoManager": false, "getUserInfo": { "object": { @@ -1754,7 +1754,11 @@ } }, "setBackgroundColor": false, - "setBackgroundFetchToken": true, + "setBackgroundFetchToken": { + "object": { + "token": true + } + }, "setBackgroundTextStyle": false, "setClipboardData": { "object": { diff --git a/packages/taro-platform-harmony-hybrid/src/api/apis/NativeApi.ts b/packages/taro-platform-harmony-hybrid/src/api/apis/NativeApi.ts index b747444770f3..43b4fc0978b9 100644 --- a/packages/taro-platform-harmony-hybrid/src/api/apis/NativeApi.ts +++ b/packages/taro-platform-harmony-hybrid/src/api/apis/NativeApi.ts @@ -10,6 +10,7 @@ const asyncAndRelease = window.MethodChannel && window.MethodChannel.jsBridgeMod // @ts-ignore const asyncAndNotRelease = window.MethodChannel && window.MethodChannel.jsBridgeMode({ isAsync: true, autoRelease: false }) || (target => target) +export let judgeUseAxios = false class NativeApi { // @ts-ignore @(syncAndRelease) @@ -893,6 +894,7 @@ class HybridProxy { get (_target: any, prop: string) { return (...args: any) => { if (this.useAxios && prop === this.requestApi) { + judgeUseAxios = this.useAxios // @ts-ignore return new RequestTask(...args) } diff --git a/packages/taro-platform-harmony-hybrid/src/api/apis/base/update/getUpdateManager.ts b/packages/taro-platform-harmony-hybrid/src/api/apis/base/update/getUpdateManager.ts index 8a2b6bf1831f..f5aee3cd9651 100644 --- a/packages/taro-platform-harmony-hybrid/src/api/apis/base/update/getUpdateManager.ts +++ b/packages/taro-platform-harmony-hybrid/src/api/apis/base/update/getUpdateManager.ts @@ -6,7 +6,6 @@ import { NativeUpdateManager } from '../../interface/NativeUpdateManager' * 获取全局唯一的版本更新管理器 * * @canUse getUpdateManager - * @null_implementation */ export const getUpdateManager: typeof Taro.getUpdateManager = () => { // 使用native方法 diff --git a/packages/taro-platform-harmony-hybrid/src/api/apis/network/request/index.ts b/packages/taro-platform-harmony-hybrid/src/api/apis/network/request/index.ts index ec627dae335c..ffbea80fc08a 100644 --- a/packages/taro-platform-harmony-hybrid/src/api/apis/network/request/index.ts +++ b/packages/taro-platform-harmony-hybrid/src/api/apis/network/request/index.ts @@ -2,7 +2,7 @@ import Taro from '@tarojs/api' import { isFunction } from '@tarojs/shared' import { NativeRequest } from '../../interface/NativeRequest' -import native from '../../NativeApi' +import native, { judgeUseAxios } from '../../NativeApi' import { getParameterError, shouldBeObject } from '../../utils' export const _request = (options) => { @@ -46,7 +46,7 @@ export const _request = (options) => { reject(res) }, }) - task = NativeRequest.getRequestTask(taskID) + task = judgeUseAxios ? taskID : NativeRequest.getRequestTask(taskID) }) as any result.onHeadersReceived = task.onHeadersReceived.bind(task) diff --git a/packages/taro-platform-harmony-hybrid/src/api/apis/request.ts b/packages/taro-platform-harmony-hybrid/src/api/apis/request.ts index b6ee87ce5fc6..e4284cb294ca 100644 --- a/packages/taro-platform-harmony-hybrid/src/api/apis/request.ts +++ b/packages/taro-platform-harmony-hybrid/src/api/apis/request.ts @@ -1,7 +1,12 @@ +import { CallbackManager } from './utils/handler' + const axios = require('axios').default const CancelToken = axios.CancelToken const source = CancelToken.source() +const callbackManager = { + headersReceived: new CallbackManager() +} const errMsgMap = new Map([ [401, 'Parameter error'], @@ -17,12 +22,11 @@ const errMsgMap = new Map([ [999, 'Unknown Other Error'], ]) +let isHeaderReceived = false export class RequestTask { - public responseHeader public abortFlag public fail public complete - public headersCallback public result public res public interceptor @@ -33,11 +37,9 @@ export class RequestTask { let { data } = object || {} const { success, fail, complete, dataType } = object || {} - this.responseHeader = null this.abortFlag = false this.fail = fail this.complete = complete - this.headersCallback = new Set() // 使用axios.create来创建axios实例 this.httpRequest = axios.create({ responseType: responseType || 'text', @@ -75,6 +77,9 @@ export class RequestTask { if (response.config.enableCache === false) { localStorage.setItem(response.config.url, JSON.stringify(response.data)) } + callbackManager.headersReceived.trigger({ + header: response.headers + }) return response }, (error) => { @@ -122,7 +127,6 @@ export class RequestTask { }) .then((response) => { if (success && !this.abortFlag) { - this.responseHeader = response.headers let result = response.result if (response.config.responseType === 'text') { if (dataType === 'text') { @@ -186,22 +190,20 @@ export class RequestTask { } onHeadersReceived (callback) { - if (!callback) { - console.error('[AdvancedAPI] Invalid, callback is null') - return - } - const taskCallback = (header) => { - !this.abortFlag && callback({ header }) - } - if (!this.headersCallback.has(callback)) { - this.headersCallback.add(taskCallback) - if (this.httpRequest) { - this.interceptor = this.httpRequest.interceptors.response.use((response) => { - taskCallback(this.responseHeader) - return response - }) + if (isHeaderReceived === false) { + const taskCallback = (header) => { + !this.abortFlag && callback({ header }) } - taskCallback(this.responseHeader) + if (!callback) { + console.error('[AdvancedAPI] Invalid, callback is null') + return + } + if (callbackManager) { + isHeaderReceived = true + callbackManager.headersReceived.addUnique(taskCallback) + } + } else { + callbackManager.headersReceived.remove(callback) } } @@ -210,14 +212,12 @@ export class RequestTask { * remove all if callback is null, otherwise remove the specialized callback */ offHeadersReceived (callback) { - if (this.headersCallback.has(callback)) { - if (this.httpRequest) { - this.httpRequest.interceptors.eject(this.interceptor) - } - this.headersCallback.delete(callback) - } else { - // eslint-disable-next-line no-console - console.debug('offHeadersReceived callback invalid') + if (!callback) { + console.error('Invalid, callback is null') + return + } + if (callbackManager && isHeaderReceived) { + callbackManager.headersReceived.remove(callback) } } } diff --git a/packages/taro-platform-harmony-hybrid/src/api/apis/storage/setBackgroundFetchToken.ts b/packages/taro-platform-harmony-hybrid/src/api/apis/storage/setBackgroundFetchToken.ts index 0649393c4149..60f2bcf8726f 100644 --- a/packages/taro-platform-harmony-hybrid/src/api/apis/storage/setBackgroundFetchToken.ts +++ b/packages/taro-platform-harmony-hybrid/src/api/apis/storage/setBackgroundFetchToken.ts @@ -8,7 +8,7 @@ import native from '../NativeApi' * 拉取 backgroundFetch 客户端缓存数据 * * @canUse setBackgroundFetchToken - * @null_implementation + * @__object [token] */ export const setBackgroundFetchToken: typeof Taro.setBackgroundFetchToken = function (options) { const name = 'setBackgroundFetchToken'