imobile_for_reactnative
Version:
iMobile for ReactNative,是SuperMap iMobile推出的一款基于React-Native框架的移动应用开发工具。基于该开发工具,用户可以使用JavaScript开发语言,开发出在Android和IOS操作系统下运行的原生移动GIS应用,入门门槛低,一次开发,处处运行。
87 lines (74 loc) • 2.5 kB
text/typescript
/**
* 管理下载,导入等进度
* 通过唯一的 key 来区分任务
*/
const _progressList: Array<{key: string, progress: number, downloaded: boolean}> = []
const _progressListeners: Array<{key: string, onBegin(): void, onProgress(progers: number): void, onEnd(): void}> = []
// ******************** 添加并更新任务进度 ********************
function addProgress(key: string) {
if(_progressList.some(item => (item.key === key && !item.downloaded))) {
__DEV__ && console.error('id or key is dupiliacateed')
} else {
removeProgress(key)
_progressList.push({key, progress: 0, downloaded: false})
const listener = _progressListeners.find(item => item.key === key)
listener && listener.onBegin()
}
}
function updateProgress(key: string, progress: number) {
const job = _progressList.find(item => item.key === key)
if(job) {
job.progress = progress
const listener = _progressListeners.find(item => item.key === key)
listener && listener.onProgress(progress)
} else {
__DEV__ && console.error('cannot find the progress')
}
}
function onProgressEnd(key: string) {
const job = _progressList.find(item => item.key === key)
if(job) {
job.downloaded = true
}
const listener = _progressListeners.find(item => item.key === key)
listener && listener.onEnd()
}
function removeProgress(key: string) {
const index =_progressList.findIndex(item => item.key === key)
if(index > -1) {
_progressList.splice(index, 1)
}
}
// ******************** 监听任务进度变化 ********************
function addProgressListener(key: string, onBegin: () => void, onProgress: (progerss: number) => void, onEnd: () => void) {
if(_progressListeners.some(item => item.key === key)) {
__DEV__ && console.error('key is duplicated')
} else {
_progressListeners.push({onProgress, key, onEnd, onBegin})
}
}
function removeProgressListener(key: string) {
_progressListeners.splice(
_progressListeners.findIndex(item => item.key === key),
1
)
}
function isInProgress(key: string): boolean {
const job = _progressList.find(item => {
return (item.key === key && !item.downloaded)
})
return job !== undefined
}
function isProgressEnd(key: string): boolean {
const job = _progressList.find(item => item.key === key)
return job ? job.downloaded : false
}
export default {
addProgress,
updateProgress,
onProgressEnd,
addProgressListener,
removeProgressListener,
isInProgress,
isProgressEnd,
}