Я хочу создать функцию, которая будет обрабатывать промисы и возвращать результат, чтобы можно было сразу работать с ним без использования дополнительных функций .then. (1) Например, я могу обработать промис следующим образом: <pre><code class="javascript">promis.then((value)=> { div.innerHTML = value[0]; // предположим, это json-объект. });</code></pre> Однако, как сделать так, чтобы это выглядело так: <pre><code class="javascript">function f() { promis.then((value)=> { return value; // предположим, это json-объект }); } let obj = f(); div.innerHTML = obj[0];</code></pre> (2) И второй вопрос: почему в данном примере не требуется использовать .then при передаче значения промиса в качестве аргумента функции? То есть приведенный ниже код работает без дополнительного .then: <pre><code class="javascript">async function loadData(url) { let f = await fetch(url); if (!f.ok) { alert('получить файл не удалось'); } else { let json = await f.json(); transferValue(json); // передаем значение } } function transferValue(data) { div.innerHTML = data[0]; // никаких .then }</code></pre>
Чтобы корректно работать с промисами без использования `.then` при возврате значений, вам необходимо использовать `async/await`. Ваша функция должна быть асинхронной, и тогда вы сможете просто `return` в этой функции. Вот как можно переписать ваш первый пример: ### 1. Пример использования async/await для возврата промиса: ```javascript async function f() { const value = await promis; // ждем разрешения промиса return value; // возвращаем результат } async function main() { let obj = await f(); // ждем результата функции f div.innerHTML = obj[0]; // работаем с результатом } // вызываем функцию main, чтобы запустить код main(); ``` Таким образом, вы сможете работать с возвращаемым значением, как с обычным результатом функции. ### 2. Ответ на второй вопрос о передаче значений: В вашем втором примере вы используете `async/await`, что позволяет вам не использовать `.then`, потому что вы ожидаете (await) разрешение промиса внутри асинхронной функции. Когда функция `loadData` вызывается и достигает `await fetch(url)`, она приостанавливает выполнение на этом этапе до тех пор, пока промис не будет разрешен, а затем продолжает выполнение с результатом. Поэтому, когда вы передаете данные в `transferValue`, это уже значение, которое было получено от промиса. В итоге, если вы хотите работать с результатами промисов без использования `.then`, применяйте `async/await`, и вы сможете писать более чистый и понятный код.
Ну во-первых, твой await x.json() при await - это тот-же then.
И тебе правильно сказали, что без await и без костылей - ты eventLoop не обыграешь.
Можно выбрасывать при await и потом ловить то, чем оказывается промис в итоге, можно юзать Promise.withResolvers, что в принципе тоже без await нереально.
Например (с withResolvers):
const { promise, resolve, reject } = Promise.withResolvers() const getProducts = () => fetch('https://fakestoreapi.com/products') try { resolve( (await getProducts()).json() ) } catch (e) { reject(e) } console.log( await promise )
Но тебе выше уже сказали, что такие операции без минимум использования оператора await - нереально исполнить. Не хочешь then - будешь юзать await, не хочешь await - будешь юзать then. Либо создавай своё подобие промисов на костылях, через кастомные события или сигналы.
P.S.: Чтобы понять, почему нельзя сделать то, что хочешь ты - прочитай то что тебе выше написали, а перед/после прочитай это .