Loading...
kyoshinn avatar kyoshinn 2 Точки

Запазване на данни от 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]) не изкарва нищо ?

 

0
JavaScript Applications
Tzigoriyn avatar Tzigoriyn 44 Точки

Първо не че има особено значение, но защо не си дефинирал let data = [];.т.е. от къде да знае кода, че пушва в масив. И също преди втория then дебъгни и виж какво получаваш от json-а.

Въпроса е не особено коректен, в какъв контекст работиш?

А иначе пробвай това в VSCode:

let data;

data.push({name:1});

data.push({prp:2});

console.log(data)

Uncaught TypeError TypeError: Cannot read property 'push' of undefined =>> да обаче ако дефинираш ==>>

let data = [];

data.push({name:1});

data.push({prp:2});

console.log(data);

[{…}, {…}]

Тук вече може да извикаш data[0] = {name:1}...

Успех!

 

1
01/05/2022 20:04:27
kyoshinn avatar kyoshinn 2 Точки

За декларирането е моя грешка тук в поста, не е това проблема. От цялото четене по форумите не разбрах как да изкарам данните в отделна променлива извън втория .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-ват заявките от сървъра

0
Tzigoriyn avatar Tzigoriyn 44 Точки

Първо при fetch('url") - не е добре да ползваш единична и двойнакавичка, още повече така изписано url ти е вече създадена променлива с адрес и направо я действаш като fetch(url).

Грешките ги хваща самият промис, ако не получи адекватен отговор от сървъра.

Трябва да създадеш променливата в главното дърво на функцията и после да я пълниш с резултата от полученият от json() обект, така ще имаш достъп до нея "променливата" от другите функции. Т.е. променливата трябва да ти е съсдадена глобално за скоупа. ако ти е създадена в контекста на вътрешна функция няма кък да я достъпиш от външна функция извън контекста на която си я създал.

Успех!

0
23/07/2022 09:49:12
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.