bindbox-mini/utils/assets.js
2025-12-15 11:43:43 +08:00

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
}