AJAX(Asynchronous JavaScript and XML)是一种异步通信技术,允许网页在不刷新整个页面的情况下与服务器交换数据。由于AJAX请求是异步的,发送顺序和响应顺序可能不一致。
当连续发送多个AJAX请求时,由于网络延迟、服务器处理时间不同等因素,后发送的请求可能先收到响应,导致响应顺序与发送顺序不一致。
async function sequentialRequests(urls) {
const results = [];
for (const url of urls) {
try {
const response = await fetch(url);
const data = await response.json();
results.push(data);
} catch (error) {
console.error(`Request failed for ${url}:`, error);
results.push(null); // 或用其他方式处理错误
}
}
return results;
}
// 使用示例
sequentialRequests(['/api/data1', '/api/data2', '/api/data3'])
.then(results => console.log(results));
function orderedParallelRequests(urls) {
const promises = urls.map(url => fetch(url).then(res => res.json()));
return Promise.all(promises).then(results => {
// 结果已经按请求顺序排列
return results;
});
}
// 使用示例
orderedParallelRequests(['/api/data1', '/api/data2', '/api/data3'])
.then(results => console.log(results));
class RequestQueue {
constructor() {
this.queue = [];
this.isProcessing = false;
}
add(url, callback) {
this.queue.push({ url, callback });
if (!this.isProcessing) {
this.processNext();
}
}
processNext() {
if (this.queue.length === 0) {
this.isProcessing = false;
return;
}
this.isProcessing = true;
const { url, callback } = this.queue.shift();
fetch(url)
.then(res => res.json())
.then(data => {
callback(null, data);
this.processNext();
})
.catch(error => {
callback(error);
this.processNext();
});
}
}
// 使用示例
const queue = new RequestQueue();
queue.add('/api/data1', (err, data) => console.log('Response 1:', data));
queue.add('/api/data2', (err, data) => console.log('Response 2:', data));
queue.add('/api/data3', (err, data) => console.log('Response 3:', data));
function orderedRequests(urls) {
const requests = urls.map((url, index) =>
fetch(url)
.then(res => res.json())
.then(data => ({ index, data }))
);
return Promise.all(requests)
.then(results => {
// 按原始顺序排序
results.sort((a, b) => a.index - b.index);
// 返回数据数组
return results.map(result => result.data);
});
}
// 使用示例
orderedRequests(['/api/data1', '/api/data2', '/api/data3'])
.then(results => console.log(results));