Я пытаюсь сохранить объекты JSON, возвращаемые API. Я сохраняю объект в переменной с именем obj, однако не могу понять, почему я не могу использовать эту переменную в функции для получения определенных свойств этого объекта.
var obj;
btn_top.addEventListener("click", function () {
fetch(url)
.then(res => res.json())
.then(data => obj = data)
.then(() => console.info(obj))
var profit = [];
console.info("testing");
console.info(obj);
Object.values(obj).forEach(e=> {
var eProfit = e.sell_average;
profit.push(eProfit);
});
console.info(profit);
});
Я получаю следующую ошибку.
main.js:46 Uncaught TypeError: Cannot convert undefined or null to object
Я могу правильно вернуть объект при использовании
.then(() => console.info(obj))
однако после этого я получаю ошибки.
Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


obj не определен, потому что выполняется запись в журнал и цикл forEach. до Promise разрешается, и obj назначается как результирующие данные из вызова Promise.
Когда вы имеете дело с обещаниями (т.е. с асинхронным кодом), вам необходимо выполнять все операции с данными в блоке then().
Как ты можешь это сделать! Получение асинхронно, прочтите документ!
следующие строки после
.then(() => console.info(obj))
Не запускаются, когда выборка заканчивается, но раньше.
Ваш «следующий» код должен быть внутри последнего обратного вызова Fetch:
fetch(url)
.then(res => res.json())
.then(jsonData=> {
let profit = [];
Object.values(jsonData).forEach(e=> {
var eProfit = e.sell_average;
profit.push(eProfit);
});
});
Попробуйте использовать асинхронные функции. Код намного чище и проще для понимания. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Попробуйте так .then ((obj) => console.info (obj))