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

Promise循环中如何等待请求响应后再发送下一个请求?

如何实现串行的请求循环(等待当前响应后再发下一个)

嘿,我来帮你搞定这个问题~ 你的代码思路方向是对的,但有个关键问题:你没有等待this.http.get()的异步请求完成就推进了Promise链,这样请求其实是并行发起的,达不到串行的效果。另外外层Promise的resolve()也没传递符合要求的字符串返回值,我来帮你修正并给出更清晰的实现方式。

问题分析

你的代码里,在setTimeout的回调中直接调用this.http.get()后就立刻执行res(),但this.http.get()是异步操作,这会导致下一个请求不等当前请求响应就发起了,完全没达到“等响应再发下一个”的目的。

解决方案一:用async/await(最易读推荐)

async/await语法能让异步代码看起来像同步代码,非常适合这种串行循环的场景:

private async start(): Promise<string> {
  for (let j = 0; j < count; j++) {
    // 等待当前HTTP请求完成
    await this.http.get();
    
    // 如果不是最后一个请求,等待1秒再发下一个(可选,根据你的需求调整)
    if (j !== count - 1) {
      await new Promise(resolve => setTimeout(resolve, 1000));
    }
  }
  
  // 所有请求完成后返回结果,这里可以根据你的实际需求修改返回内容
  return "所有串行请求已完成";
}

解决方案二:修正你的Promise链写法

如果你更习惯用Promise链的方式,可以这样修改代码,确保每个请求完成后再推进链:

private start(): Promise<string> {
  let promiseChain = Promise.resolve();
  
  for (let j = 0; j < count; j++) {
    promiseChain = promiseChain.then(() => {
      // 先等待当前HTTP请求完成
      return this.http.get().then(() => {
        // 非最后一个请求的话,等待1秒
        if (j !== count - 1) {
          return new Promise(resolve => setTimeout(resolve, 1000));
        }
      });
    });
  }
  
  // 所有请求完成后返回指定字符串
  return promiseChain.then(() => "所有串行请求已完成");
}

关键注意点

  • 确保this.http.get()返回的是一个Promise,这样才能用await或者.then()来等待它的响应。
  • 两种方案都是严格串行的:只有当前请求得到响应后,才会处理下一个请求(如果有延迟的话会先等延迟)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:55:17