(async function(){
// запрминаем время
let start = Date.now();
console.log("стартуем");
// getResource() это должна быть некая функчия, которая делает асинхронный запрос к серверу и возвращает thenable объект:
// раз - https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve
// два - https://ru.stackoverflow.com/questions/877248/%D0%A7%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-thenable-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82
// имитируем заявленное поведение в части касающейся длительности ожидания ответа. Пусть она будет 1 секунду.
function getResource(){
let promise = new Promise((resolve,reject)=>{
setTimeout(()=>{
let now = Date.now();
console.log("сработал setTimeout. прошло", now-start, "мс");
resolve("any data");
}, 1000)
});
return promise;
}
// тут мы запрашиваем обращаемся к серверу, при этом запрос может быть выполнен как очень быстро так и очень медленно а так же он может быть вообще не выполнен (зависит от загруженности сети, состояния и загруженности сервера)
const promise = getResource();
// выводим текущее значение таймера
let now = Date.now();
console.log("запросили данные у getResource. прошло", now-start, "мс");
// тут мы конечно можем делать синхронные операции,но так как они синхронные, то пока они не отработают выполнение кода дальше не двинется.
// сделаем СИНХРОННЫЙ код, работающий 2 секунды
while(now-start<2000){
now = Date.now();
}
// еще раз выводим текущее значение таймера
now = Date.now();
console.log("синхронный код завершился. прошло", now-start, "мс");
// тут мы просто говорим, что ждем пока сделанный запрос на сервер не вернет данные код, находящийся далее не исполнять. Начнет его исполнять только после получения данных, сколько бы запрос к серверу не длился (в разумных пределах конечно. Существуют различные таймауты на установку соединения, на ожидание ответа и т.д.). При этом пока исполнение кода в данном блоке находится как бы на паузе, интерпретатор может выполнять другие задачи имеющиеся в eventloop. Таким образом достигается стиль написания кода, похожий на синхронный но являющийся асинхронным.
const data = await promise;
// еще раз выводим текущее значение таймера
now = Date.now();
console.log("дождались данных от getResource", data, ". прошло", now-start, "мс");
})();
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.