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
相关产品推荐
相关产品推荐

