Synchronous XMLHttpRequest outside of workers is in the process of
being removed from the web platform as it has detrimental effects to
the end user’s experience. (This is a long process that takes many
years.) Developers must not pass false for the async argument when
current global object is a Window object. User agents are strongly
encouraged to warn about such usage in developer tools and may
experiment with throwing an "InvalidAccessError" DOMException when it
occurs.
https://xhr.spec.whatwg.org/
If you would like to have some tasks to do after XMLHttpRequest then please use Promise
instead because Synchronous XMLHttpRequest will be removed in the future.
Here is an example (test02.php):
<?php
$requestType = ($_GET['requestType'] ?? null);
if (isset($requestType) && $requestType === 'ajax') {
sleep(1);
echo 'hello';
exit();
}
?>
<div id="response" style="border: 4px dashed #ccc;"></div>
<script>
function ajaxRequest() {
let promiseObj = new Promise(function(resolve, reject) {
var xhr=new XMLHttpRequest();
xhr.addEventListener('abort', (event) => {
reject({'response': '', 'status': (event.currentTarget ? event.currentTarget.status : 'abort'), 'event': event});
});
xhr.addEventListener('error', function(event) {
reject({'response': '', 'status': (event.currentTarget ? event.currentTarget.status : ''), 'event': event});
});
xhr.addEventListener('timeout', (event) => {
reject({'response': '', 'status': (event.currentTarget ? event.currentTarget.status : 'timeout'), 'event': event});
});
xhr.addEventListener('load', function(event) {
let response = (event.currentTarget ? event.currentTarget.response : '');
if (event.currentTarget && event.currentTarget.status >= 200 && event.currentTarget.status < 300) {
resolve({'response': response, 'status': event.currentTarget.status, 'event': event});
} else if (event.currentTarget && event.currentTarget.status >= 400 && event.currentTarget.status < 600) {
reject({'response': response, 'status': event.currentTarget.status, 'event': event});
} else {
reject({'response': response, 'status': event.currentTarget.status, 'event': event});
}
});
xhr.open("POST","test02.php?requestType=ajax");// use your URL.
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// add your xhr options here.
xhr.send();
});
return promiseObj;
}
ajaxRequest()
.then((response) => {
let responseElement = document.getElementById('response');
responseElement.insertAdjacentHTML('beforeend', response.response + '<br>');
responseElement.insertAdjacentHTML('beforeend', 'hi');
});
</script>
This Asynchronous request will not freeze user's web browser and the task(s) after this still working fine as queue by then()
.