for (let i = 0; i < 9999999999; i++) {
// some blocking stuff
// some non-blocking stuff
}
при блокировании , это означает синхронное выполнение кода, которое выполняется системой и не может быть прервано.Рассмотрите возможность изменения размера изображения там или это может быть преобразование документа в PDF, которое реализовано так, чтобы происходить синхронно.
по неблокирующим , это означает код, который выполняет некоторую часть и может ожидать какое-то событие в будущем или некоторый ввод-вывод (запись на диск?, Пользовательский ввод (get) или network (xhr?)), когда такие вызовы выполняются, они запускают свой частичный код и регистрируют себя в очереди, откуда они могут возобновить работу после завершения ожидающей обработки.
Теперь, что произойдет, если будет выполнен следующий код (добавлены номера строк для справки):
1. function mycallback(data) {
2. // some code
3. }
4. function_which_takes_a_callback(mycallback);
5. for (let i = 0; i < 999; i++) {
6. // some blocking stuff(for example 1s)
7. // some non-blocking stuff
8. }
из строки 1-3, зарегистрирована функция mycallback
.
вВ строке 4 выполняется function_which_takes_a_callback, и передается mycallback, он выполняет некоторую работу и может вызывать mycallback после выполнения в строке 5-8, 999 раз поток блокируется как минимум 999 раз, пока не будет выполнен mycallback
.
Только после того, как этот код будет выполнен с его выполнением, он освободит стек, вызывая цикл обработки событий из очереди событий, которая может быть обработана.
Попробуйте это:
function syncCode() {
var fromTime = Date.now();
var toTime = Date.now() + 1000;
while (fromTime < toTime) {
fromTime = Date.now();
}
}
function asyncCode() {
console.log(new Date(), "Invoked asyncCode");
setTimeout(() => {
console.log(new Date(), "async code should have come 1s after Start");
}, 1000);
}
console.log(new Date(), "Start");
asyncCode();
console.log("Sync code repeatedly for 10s");
for(var i = 0; i < 10; i++) {
syncCode();
setTimeout(() => {
console.log(new Date(), "sync code should be coming after async code callback");
}, 1000)
}
console.log(new Date(), "End");