使用 Promise 并发执行并在全部完成后继续。常用做法有 Promise.all(任一失败则抛错)、Promise.allSettled(全部完成后继续并分别处理成功 / 失败)。示例代码:
使用 Promise.all(所有成功后继续,任一失败会进入 catch):
// ...existing code... | |
async function loadGroupModel(group) { | |
// 并行启动多个异步任务(这些函数返回 Promise) | |
const tasks = [ | |
loadModelA(group), | |
loadModelB(group), | |
loadTexture(group), | |
initAnimations(group) | |
] | |
try { | |
// 等待所有任务完成 | |
const [modelA, modelB, texture, anims] = await Promise.all(tasks) | |
// 所有任务成功后执行下一步 | |
onAllLoaded({ modelA, modelB, texture, anims }) | |
} catch (err) { | |
console.error('loadGroupModel 出错:', err) | |
// 根据需求处理失败:重试 / 回退 / 通知用户 等 | |
} | |
} | |
// ...existing code... |
使用 Promise.allSettled(即使有失败也继续,按需处理失败项):
// ...existing code... | |
async function loadGroupModel(group) { | |
const tasks = [ | |
loadModelA(group), | |
loadModelB(group), | |
loadTexture(group), | |
initAnimations(group) | |
] | |
const results = await Promise.allSettled(tasks) | |
const successes = results | |
.map(r => (r.status === 'fulfilled' ? r.value : null)) | |
const errors = results | |
.map((r, i) => (r.status === 'rejected' ? { index: i, reason: r.reason } : null)) | |
.filter(Boolean) | |
if (errors.length) { | |
console.warn('部分任务失败:', errors) | |
// 按需处理失败(跳过 / 重试 / 报错等) | |
} | |
onAllLoaded({ successes }) | |
} | |
// ...existing code... |
如果任务很多或需要限流,可用简单限流器或第三方库(p-limit)控制并发:
// ...existing code... | |
import pLimit from 'p-limit' | |
async function loadGroupModel(group, concurrency = 4) { | |
const limit = pLimit(concurrency) | |
const items = [/* 要加载的资源数组 */] | |
const tasks = items.map(item => limit(() => loadItem(item, group))) | |
const results = await Promise.all(tasks) | |
onAllLoaded(results) | |
} | |
// ...existing code... |