问答题1160/1587请实现一个函数,要求能在页面请求很多时,尽可能快地按照顺序输出返回的结果。

1const promiseList = [ 2 new Promise((resolve) => { 3 setTimeout(resolve, 1000) 4 }), 5 new Promise((resolve) => { 6 setTimeout(resolve, 2000) 7 }), 8 new Promise((resolve) => { 9 setTimeout(resolve, 3000) 10 }), 11 new Promise((resolve) => { 12 setTimeout(resolve, 1500) 13 }) 14] 15 16fn(promiseList);
难度:
2023-05-30 创建

参考答案:

要实现在页面请求很多时,尽可能快地按顺序输出返回结果,可以使用 Promiseasync/await 来处理异步请求,并通过控制并发请求数量和使用队列来保持请求的顺序。

以下是一个示例函数processRequests,该函数接收一个包含请求URL的数组,并按照顺序发起异步请求,等待所有请求完成后按顺序输出返回的结果:

1function processRequests(urls) { 2 const results = []; 3 4 // 并发请求数量 5 const concurrentLimit = 5; 6 7 // 创建一个队列来存储请求 8 const queue = urls.slice(); 9 10 // 递归函数,依次处理队列中的请求 11 async function sendRequest() { 12 if (queue.length === 0) { 13 // 队列为空,所有请求已完成,输出结果 14 console.log(results); 15 return; 16 } 17 18 // 取出队列中的下一个请求 19 const url = queue.shift(); 20 21 try { 22 // 发起异步请求 23 const response = await fetch(url); 24 25 // 处理请求结果,这里假设返回的是文本 26 const result = await response.text(); 27 28 // 将结果存入数组中 29 results.push(result); 30 31 // 递归调用自身,继续处理下一个请求 32 sendRequest(); 33 } catch (error) { 34 // 处理请求错误 35 console.error(`Request failed for ${url}:`, error); 36 37 // 递归调用自身,继续处理下一个请求 38 sendRequest(); 39 } 40 } 41 42 // 控制并发请求数量,同时发送多个请求 43 for (let i = 0; i < concurrentLimit; i++) { 44 sendRequest(); 45 } 46}

使用示例:

1const urls = [ 2 'https://api.example.com/1', 3 'https://api.example.com/2', 4 'https://api.example.com/3', 5 // ...更多请求URL 6]; 7 8processRequests(urls);

processRequests函数将请求URL数组作为参数,并创建一个队列来存储请求。通过控制并发请求数量,每次最多发送concurrentLimit个请求,等待这些请求完成后再继续处理下一个请求。当所有请求完成后,按顺序输出返回的结果。

最近更新时间:2023-07-08

赞赏支持

预览

题库维护不易,您的支持就是我们最大的动力!