You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 16中按延迟触发异步任务并等待全部完成

问题分析

你的代码存在三个核心问题:

  1. 未调用初始的executeNext(),导致整个重命名流程完全无法启动;
  2. 当前逻辑是串行执行(上一个用户重命名完成后,等待200ms再触发下一个),而非按固定间隔200ms触发请求,不符合“避免压垮API”的触发节奏需求;
  3. 没有收集所有重命名任务的Promise,无法判断所有异步操作是否全部完成。
解决方案

针对你的需求(按200ms间隔触发所有重命名请求,等待全部完成后执行后续操作),以下是两种适配不同错误处理场景的实现:

场景1:任一任务失败立即终止流程

如果希望只要有一个用户重命名失败,就立刻停止后续处理并抛出错误,可使用Promise.all实现:

async triggerRenameProcess(users: RenameUser[]) {
  try {
    await this.renameUsersWithDelay(users, 200);
    console.log('All users renamed');
    // 在这里执行所有重命名完成后的后续任务
  } catch (error) {
    console.error('Exception while renaming users: ', error);
  }
}

renameUsersWithDelay(users: RenameUser[], delay: number): Promise<void> {
  const renamePromises: Promise<void>[] = [];

  users.forEach((user, index) => {
    // 按索引计算延迟:第1个立即触发,第2个200ms后,第3个400ms后...
    const taskPromise = new Promise<void>((resolve, reject) => {
      setTimeout(() => {
        user.executeRename()
          .then(resolve)
          .catch(reject);
      }, index * delay);
    });
    renamePromises.push(taskPromise);
  });

  // 等待所有任务完成,任一失败则直接抛出错误
  return Promise.all(renamePromises).then(() => {});
}

场景2:等待所有任务完成(无论成功失败)

如果希望不管单个任务是否失败,都等待所有重命名请求执行完毕,再统一处理失败情况,可使用Promise.allSettled:

async triggerRenameProcess(users: RenameUser[]) {
  try {
    const results = await this.renameUsersWithDelay(users, 200);
    // 筛选出失败的任务并处理
    const failedTasks = results.filter(result => result.status === 'rejected');
    if (failedTasks.length > 0) {
      console.error(`Failed to rename ${failedTasks.length} users`, failedTasks);
    }
    console.log('All rename attempts completed');
    // 在这里执行所有任务完成后的后续任务
  } catch (error) {
    console.error('Unexpected error: ', error);
  }
}

renameUsersWithDelay(users: RenameUser[], delay: number): Promise<PromiseSettledResult<void>[]> {
  const renamePromises: Promise<void>[] = [];

  users.forEach((user, index) => {
    const taskPromise = new Promise<void>((resolve, reject) => {
      setTimeout(() => {
        user.executeRename()
          .then(resolve)
          .catch(reject);
      }, index * delay);
    });
    renamePromises.push(taskPromise);
  });

  // 等待所有任务完成,无论成功或失败
  return Promise.allSettled(renamePromises);
}
关键说明
  • 上述实现中,Promise.all/Promise.allSettled对应你熟悉的.NET中WaitAll的逻辑,用于等待所有异步任务完成;
  • 通过index * delay计算每个任务的触发延迟,确保请求按固定200ms间隔依次发送,避免瞬间压垮API;
  • 所有重命名任务的Promise被统一收集,确保能准确判断全部任务的完成状态。

内容的提问来源于stack exchange,提问作者Aileron79

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:13:18