navigateTo.ts 1.0 KB
Newer Older
fxy060608's avatar
fxy060608 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
import type { EventChannel } from '@dcloudio/uni-shared'
import { MPProtocol } from './types'

const eventChannels: Record<string, EventChannel> = {}

const eventChannelStack: EventChannel[] = []

let id = 0

export function initEventChannel(
  events: Record<string, (...args: any[]) => void>,
  cache = true
) {
  id++
  const eventChannel = new __GLOBAL__.EventChannel(id, events)
  if (cache) {
    eventChannels[id] = eventChannel
    eventChannelStack.push(eventChannel)
  }
  return eventChannel
}

export function getEventChannel(id?: number) {
  if (id) {
    const eventChannel = eventChannels[id]
    delete eventChannels[id]
    return eventChannel
  }
  return eventChannelStack.shift()
}

export const navigateTo: MPProtocol = {
  args(fromArgs) {
    const id = initEventChannel(fromArgs.events).id
    if (fromArgs.url) {
      fromArgs.url =
        fromArgs.url +
        (fromArgs.url.indexOf('?') === -1 ? '?' : '&') +
        '__id__=' +
        id
    }
  },
  returnValue(fromRes) {
    fromRes.eventChannel = getEventChannel()
  },
}