不确定个数的回调函数怎么等待全部回调之后再执行下一步?
发布于 6 年前 作者 helloMane 2401 次浏览 来自 问答

例如,我这里需要动态获取url地址,个数不确定,然后使用 function funcA(){ http.request(options, (ret) => { //TODO }) } 怎么样在所有回调全部执行后再执行下一步?另外,有些url的访问可能会超时(超过3m之后才会返回超时信息),该怎么处理?

15 回复

可以使用async await函数

封装成Promise, 用Promise.all()吧

用 Promise.all() 要注意,一个网络请求 GG 就全部 GG,解决方案封装 promise 注意不管成功失败都调用 resolve 就 OK

设置一个计数器 count 每次成功回调count+1 判断count是否到达上限 到了就调用一个函数表示继续。 比promise简单。

@xcstream 我也试过自己设一个计数器,但是难点就在于: 1.个数不确定,如果使用length之类的,就会遇到难点2; 2.有的请求会time-out,总不可能等3m之后再继续执行吧。

@yinxin630 这些都没问题,但是最难的问题在于如何把超过一定时间的请求自动丢弃?因为有的请求会超时,总不能等3m超时信息返回回来之后再继续执行吧。

@yuezm 有的请求会超时,怎么办?

@liangtongzhuo 关键是,他还不GG,他只是超时,现在情况就是想把超时的访问直接丢弃,这个就是很难办的地方。

每一次请求,options里面可以设置超出时间

@helloMane 请求不带超时设置吗?没有自己启动一个定时器,回调

@liangtongzhuo 你的意思是setTimeout?我现在用的就是这个方法,但是感觉效果不是很好,例如请求5次,但是有2次为超时请求,其他三次都会有各自的setTimeout,时间若是设置得太短,则有些不是超时的请求也会被丢弃;时间若是设置的太长,则等待时间又会增长,况且随着请求数量的不确定性,这个方法人为控制的成本太大了。不知道我说的有没有道理?

@helloMane 你是在使用http.request方法么,在options里面有一个 timeout 2018-08-21 16-19-46屏幕截图.png

@helloMane 你没有把成功的定时器取消吗? 最好用自带的超时时间

@yuezm request被封装过。。。看样子只能改改这个封装了。

回到顶部