Name | LastName
, смешенный вариант не подходит в такой тип а как настроить переход по файлам через функцию по ним?
operator await(jsValue) {
// ждем ближайший микротаск
yield JS_RUNTIME.nextMicroTaskInEventLoop;
// если у jsValue нет метода then
if (typeof jsValue?.then !== 'function') {
// то просто возвращаем его
return jsValue;
}
// внутреннее состояние
let isRejected = false;
let result;
// штука которая позволяет запланировать выполнение в микротаске
const microtaskScheduler = JS_RUNTIME.createMicrotaskScheduler();
// колбэки для then
const resolve = (value) => {
result = value;
microtaskScheduler.schedule();
};
const reject = (value) => {
result = value;
isRejected = true;
microtaskScheduler.schedule();
};
// вызываем метод then
jsValue.then(resolve, reject);
// ждем ближайший микротаск после вызова microtaskScheduler.schedule()
yield microtaskScheduler;
// возвращаем результат
if (isRejected) {
throw result;
} else {
return result;
}
}
(async () => {
console.log(0)
const r = await {
then(onResolve, onRejected) {
console.log(2);
setTimeout(onResolve, 1500, 3);
},
};
console.log(r);
})();
console.log(1);
sladkiy_voytik, Ограничение глубины рекурсии - это прямое следствие из ограничения размера стека, при асинхронных вызовах стек очищается между ними.
Простой пример:
1. Функция упадет с ошибкой из-за бесконечной рекурсии и переполнения стека:
2. Функция повесит все намертво из-за особенностей event-loop микротасков, но ошибки не будет:
3. Будет крутится вечно и ничего не повесит: