循环中使用fetch如何访问循环计数器
循环中使用fetch保留请求时的ctr值,同时并行发起请求
核心问题解决:传递发起请求时的ctr值
你代码里用let声明ctr其实已经解决了关键问题——let在for循环的每次迭代中都会创建独立的变量绑定,每个异步回调(then里的函数)捕获的都是当前迭代的那个ctr,不会被后续循环覆盖。直接在回调里使用ctr即可:
for (let ctr = 0; ctr < 10; ctr++) { fetch(URL_OF_SOME_API, fetch_options) .then((response) => response.json()) .then(function (data_returned_by_API) { // 这里的ctr就是发起请求时的数值,可以直接使用 console.log(`处理第${ctr}次请求的返回数据`, data_returned_by_API); }); }
如果想要更显式地绑定请求与ctr的关联,也可以在第一个then中将两者打包返回:
for (let ctr = 0; ctr < 10; ctr++) { fetch(URL_OF_SOME_API, fetch_options) .then(response => { // 用Promise.all同时获取接口数据和当前的ctr值 return Promise.all([response.json(), ctr]); }) .then(([data_returned_by_API, requestCtr]) => { // requestCtr就是发起请求时的ctr值 console.log(`处理第${requestCtr}次请求的返回数据`, data_returned_by_API); }); }
关于并行vs串行请求的效率
你的判断完全正确:并行发起所有fetch请求比串行(等待前一个请求完成再发下一个)高效得多。并行请求的总耗时取决于最慢的那个请求的响应时间,而串行请求的总耗时是所有请求时间的总和。除非目标API有并发请求限制,或者需要前一个请求的结果作为后一个请求的参数,否则并行是更优的选择。
内容的提问来源于stack exchange,提问作者Mick
相关产品推荐
相关产品推荐

