等待所有XHR(XMLHttpRequest)请求完成通常是在JavaScript中进行异步操作的一个需求。这可以通过多种方式实现,以下是几种常见的方法:
如果你使用的是现代的JavaScript环境(ES6+),可以使用Promise.all
来等待所有XHR请求完成。每个XHR请求都可以被封装成一个Promise对象。
function makeRequest(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
const urls = ['url1', 'url2', 'url3'];
Promise.all(urls.map(makeRequest))
.then(responses => {
console.log('All requests completed', responses);
})
.catch(error => {
console.error('An error occurred', error);
});
如果你使用的是较旧的JavaScript环境,或者不想使用Promise,可以使用回调函数来实现。
function makeRequest(url, callback) {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = () => callback(null, xhr.responseText);
xhr.onerror = () => callback(xhr.statusText);
xhr.send();
}
const urls = ['url1', 'url2', 'url3'];
let completedRequests = 0;
const results = [];
function checkAllRequestsCompleted() {
if (completedRequests === urls.length) {
console.log('All requests completed', results);
}
}
urls.forEach(url => {
makeRequest(url, (error, response) => {
if (error) {
console.error('An error occurred', error);
} else {
results.push(response);
completedRequests++;
checkAllRequestsCompleted();
}
});
});
如果你更喜欢使用现代JavaScript的语法,可以使用async/await
来简化代码。
async function makeRequest(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
async function fetchAllRequests() {
const urls = ['url1', 'url2', 'url3'];
try {
const responses = await Promise.all(urls.map(makeRequest));
console.log('All requests completed', responses);
} catch (error) {
console.error('An error occurred', error);
}
}
fetchAllRequests();
等待所有XHR请求完成的场景包括但不限于:
XMLHttpRequest
的timeout
属性来处理请求超时。onerror
事件来处理请求失败的情况。通过以上方法,你可以有效地等待所有XHR请求完成,并处理相关的应用场景和问题。
领取专属 10元无门槛券
手把手带您无忧上云