Я пытаюсь понять механизм асинхронных функций.Я нашел код на MDN docs MDN docs , внес некоторые изменения и ... не могу полностью понять, как это работает.
var resolveAfter2Seconds = function() {
console.log("starting slow promise");
return new Promise(resolve => {
setTimeout(function() {
resolve(20);
console.log("slow promise is done");
}, 6000);
});
};
var resolveAfter1Second = function() {
console.log("starting fast promise");
return new Promise(resolve => {
setTimeout(function() {
resolve(10);
console.log("fast promise is done");
}, 4000);
});
};
var sequentialStart = async function() {
console.log('==SEQUENTIAL START==');
const slow = await resolveAfter2Seconds();
const fast = await resolveAfter1Second();
console.log(fast);
console.log('why?');
console.log(slow);
}
sequentialStart();
На данный момент я знаю, что если мы запустим этот код, мы сразу получим «== SEQUENTIAL START ==» на консоли, а затем «запуск медленного обещания», тогда мы получимОбещание с setTimeout, которое указывает, что «медленное обещание выполнено» появится через 6 секунд, а обратный вызов resol (20) будет сохранен в контейнере api, так как стек выполнения будет пустым. JS дает нам «стартовое быстрое обещание» и через четыре секундымы получаем «быстрое обещание выполнено», а затем сразу 10, «почему?», 20.
Я не понимаю: что именно происходит в фоновом режиме - я знаю, что resol (20) хранится в контейнере API.и остальной код выполняется, затем resol (10) также хранится в контейнере api, а когда стек выполнения пуст, они возвращаются как результат разрешения их обещаний.
Но:
Что с таймером?10, почему 20 появляется через много времени после истечения времени ожидания - разрешение 20 появляется на экране через 6 секунд.
Что с заказом?Кажется, что они (решите 20 и решите 10) готовы к выполнению и хранятся в памяти, пока я их не использую - в этом случае вывести их на консоль?ВРЕМЯ ВРЕМЕНИ И ЗАКАЗА
Я полон решимости понять это правильно.