如何改造Promise代码实现串行请求 解决高并发触发服务器限流
接口串行调用改造方案
针对触发服务端限流的场景,将原有基于Promise.all的全并发实现调整为“上一个请求完成后再发起下一个”的串行模式,从根源上规避短时间请求洪峰。
改造后完整代码
public async getProfits(data) { const processedList = []; // 按数组原有顺序逐条目发起串行请求 for (const obj of data) { // 等待当前请求响应完成,才会执行下一轮循环 const rawRes = await this.getProfit(obj.symbol); obj.stat = rawRes; processedList.push(obj); } // 完全保留原有排序、赋值逻辑 this.data = this.dataService.ascArray(processedList, 'symbol'); }
实现注意事项
- 逻辑一致性:改造后完全匹配原有代码的字段赋值规则、最终排序逻辑,不需要调整上层业务的取值规则
- 调用兼容性:改造后的方法为async方法,返回值仍然是Promise,原有上层调用该方法的代码(不管是await调用还是.then链式调用)完全不需要修改
- 执行特性:全程无并发请求,单时刻仅存在一个在途接口请求,不会触发服务端的短时间请求次数限流规则
- 异常适配:默认实现中如果单条请求抛出错误,会直接中断后续所有请求;如果需要容错,可在循环内部补充
try/catch捕获单请求异常,将失败条目以默认值存入结果列表后继续执行后续流程
如果全串行导致整体请求耗时过长,可后续调整为固定并发数的并发窗口模式(比如每次最多同时发起3个请求),但对于限流规则严格的服务端,全串行是最稳妥的初始方案。
内容的提问来源于stack exchange,提问作者Ellen Mina Kim
相关产品推荐
相关产品推荐

