在JavaScript中,Ajax请求是异步执行的,这意味着多个请求可能不会按照发送顺序完成回调。当需要确保多个异步请求的回调按照特定顺序执行时,就需要采取一些控制手段。
Ajax请求的异步特性导致:
async function sequentialRequests(urls) {
const results = [];
for (const url of urls) {
const response = await fetch(url);
const data = await response.json();
results.push(data);
}
return results;
}
let promiseChain = Promise.resolve([]);
urls.forEach(url => {
promiseChain = promiseChain.then(results => {
return fetch(url)
.then(response => response.json())
.then(data => [...results, data]);
});
});
promiseChain.then(finalResults => {
console.log(finalResults);
});
async function processInOrder(urls) {
const results = [];
for (let i = 0; i < urls.length; i++) {
const response = await fetch(urls[i]);
const data = await response.json();
results[i] = data; // 保持原始顺序
}
return results;
}
function orderedParallelRequests(urls) {
// 并行发起所有请求
const requests = urls.map(url => fetch(url).then(res => res.json()));
// 按顺序处理结果
return requests.reduce((chain, request) => {
return chain.then(results => {
return request.then(data => [...results, data]);
});
}, Promise.resolve([]));
}
class RequestQueue {
constructor() {
this.queue = [];
this.processing = false;
}
add(url, callback) {
this.queue.push({ url, callback });
if (!this.processing) {
this.process();
}
}
async process() {
this.processing = true;
while (this.queue.length > 0) {
const { url, callback } = this.queue.shift();
try {
const response = await fetch(url);
const data = await response.json();
callback(null, data);
} catch (error) {
callback(error);
}
}
this.processing = false;
}
}
| 方法 | 优势 | 劣势 | |------|------|------| | 串行请求 | 实现简单,顺序绝对保证 | 效率低,总时间为各请求之和 | | Promise链 | 相对清晰的控制流 | 代码可能变得复杂 | | async/await | 代码简洁易读 | 仍然是串行执行 | | 并行+顺序处理 | 效率较高,并行请求 | 需要额外处理逻辑 | | 队列控制 | 灵活,可动态添加请求 | 实现复杂度较高 |
选择哪种方法取决于具体场景对效率和顺序严格性的要求。