Как вы знаете, таймеры задерживаются на потом в потоке, но вызывающая их функция продолжает выполняться сразу же. Невозможно отложить выполнение текущей функции без блокировки браузера и предотвращения взаимодействия пользователя с браузером.
Здесь вступают в игру точки обратного вызова. Вместо того, чтобы пытаться отложить продолжение выполнения кода, вы предоставляете функцию в качестве параметра для функции «задержки», а когда у нее есть необходимые данные, готовые, она выполняет функцию обратного вызова с данными в качестве параметра.
function submitRequest(callback) {
xmlHttp.open("POST", "xxx", true);
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("Content-Length", 10);
xmlHttp.onreadystatechange = function ()
{
if (xmlHttp.readyState == 4 && xml.status == 200)
{
var myArray;
// do something with data
callback(myArray); // execute the callback function
}
};
xmlHttp.send(locParam);
}
function someCallingFunction()
{
// call submitRequest with an anonymous function as the callback parameter
submitRequest(function (myArray)
{
alert("end sleep");
// do something with myArray
});
}