36 lines
1.1 KiB
JavaScript
36 lines
1.1 KiB
JavaScript
export async function ensureLocal(url) {
|
|
return new Promise((resolve) => {
|
|
try {
|
|
const cache = uni.getStorageSync('asset_cache_v1') || {}
|
|
const hit = cache[url]
|
|
if (hit && typeof hit === 'string' && hit) { resolve(hit); return }
|
|
uni.downloadFile({
|
|
url,
|
|
success: (res) => {
|
|
const tmp = res.tempFilePath || ''
|
|
if (!tmp) { resolve(url); return }
|
|
uni.saveFile({
|
|
tempFilePath: tmp,
|
|
success: (s) => {
|
|
const saved = s.savedFilePath || tmp
|
|
cache[url] = saved
|
|
uni.setStorageSync('asset_cache_v1', cache)
|
|
resolve(saved)
|
|
},
|
|
fail: () => { resolve(tmp) }
|
|
})
|
|
},
|
|
fail: () => { resolve(url) }
|
|
})
|
|
} catch (_) { resolve(url) }
|
|
})
|
|
}
|
|
|
|
export async function preloadAssets(urls) {
|
|
const tasks = urls.map(u => ensureLocal(u))
|
|
const results = await Promise.allSettled(tasks)
|
|
const map = {}
|
|
results.forEach((r, i) => { map[urls[i]] = r.status === 'fulfilled' ? r.value : urls[i] })
|
|
return map
|
|
}
|