Запазване на данни от Promise в променлива
Как процедираме в реален код при следното положение:
let data;
fetch('url')
.then(resolve => resolve.json())
then(resources => resources.forEach(res => data.push(res)));
това не би ли трябвало да запише всеки обект от ресурсите в променливата data ?
И защо след това като извикаме console.log(data); ни изкарва на конзолата масива с обекти с данните, а с console.log(data[0]) не изкарва нищо ?
За декларирането е моя грешка тук в поста, не е това проблема. От цялото четене по форумите не разбрах как да изкарам данните в отделна променлива извън втория .then(който реално е за promise-а на response.json()), защото се изпълнява асинхроно, изобщо не разбрах дали е възможно и дали се прави. Няма значение от контекста, идеята е фундаментална, взимаш данни през fetch get заявка (най-обикновен масив от обекти, например котки), как да запишем тези данни в променлива, която може да ползваме наляво и надясно в нашия код. Ако трябва да дам паралел, както с document.GetElementById('neshto si").textContect/Value може да вземем данните в дадено поле по дома и да го запазим в променлива, то как с fetch като вземем данните от сървъра, то да можем да си запазим данните в наша променлива ?
Днес се сблъсках с втори проблем или по-скоро чуденка и тя е следната - как точно се верифицира response-a от fetch-а.
В случая като дам заявка към ресурс, който не същеструва искам да хвърли грешка, която да хвана отдолу в кеша и да направя нещо по екрана. Пробвах със следното:
fetch('url")
.then(response => {
if (!response.ok) {
throw new Error(response.statusText);
}
return response.json(); // или response.text(), ако е текст
}
.then(resources => направи нещо с данните от сървъра, при положение, че сървъра е върнал данни със статус ok...)
.catch(error => направи нещо при положение, че отговора от сървъра не е върнал данни и статус ok);
В този случай очаквах, че при валиден отговор ok примерно, то ще вляза във втория then, където ще мога да си обработя данните и т.н., а ако сървъра върне 404 например или каквото и да е различно от 200/ok, то ще хвърля грешка, която директно ще ме прати в catcha отдолу, но уви не става. Четох, четох и така и не мога да схвана как се handle-ват заявките от сървъра
Първо при fetch('url") - не е добре да ползваш единична и двойнакавичка, още повече така изписано url ти е вече създадена променлива с адрес и направо я действаш като fetch(url).
Грешките ги хваща самият промис, ако не получи адекватен отговор от сървъра.
Трябва да създадеш променливата в главното дърво на функцията и после да я пълниш с резултата от полученият от json() обект, така ще имаш достъп до нея "променливата" от другите функции. Т.е. променливата трябва да ти е съсдадена глобално за скоупа. ако ти е създадена в контекста на вътрешна функция няма кък да я достъпиш от външна функция извън контекста на която си я създал.
Успех!