Pewnie było sto razy - wyciąganie danych z async/ await

Odpowiedz Nowy wątek
2019-06-07 13:52
0

Cześć, zaciąłem sie na czymś co pewnie jest proste, tyle, że nie dla mnie.
To, co poniżej to dwie (z wielu) metod klasy. Pierwsza - remoteLoad ma zerealizowac pobranie danych z zewnętrznego źródła, druga -getData- natomiast ma zrealizować takie pobranie i zwrócić dane. w sytuacji kiedy w storage nie ma danych. Jak sie zapewne domyślacie ostatecznie zwracana jest Promise co jest niepożądan, chciałbym mieć konkretna wartość.
Oczysiście w zakresie remoteLoad mam dostęp do właściwych wartości co sobie sprawdzam przez console.log(resp). Tyle, że potrzebuję tych wartości poza nią a nie w niej. Niemożliwe, żeby to nie było realizowalne, jednak wypróbowałem kilka sposobów - prostsze tj. praca na czystych promise, bardziej zaawansowane - axios i jeszcze trochę innych a nie jestem bliżej. Nie miałbym pewnie problemu z wykonaniem jakiejś funkcji na tych danych w zakresie try, ewentualnie pewnie dałoby się zapisac w jakims sztucznym stanie, ale ja to potrzebuję tego po prostu na zewnątrz w takim ukladzie mniej wiecej jak napisałem.

async remoteLoad(){
var that = this;
var result = null;
    try {
        const x = await fetch('https://api.myjson.com/bins/amapk');
        const resp = await x.json();
        console.log (resp);
        return resp;
        }

        catch(e){console.log(e)}

}

getData() {
    return this.storageService.areInStorage() ? this.storageService.load('localBooks') : this.remoteLoad();
}
Oczywiście w getData funkcja nie musi być tożsama z this.remoteLoad, jednak ta funkcja w getData musi być funkcja i zwracać to o czym napisałem. I ja naprawdę nie wiem jak to ugryźć - Krajeski 2019-06-07 14:05

Pozostało 580 znaków

2019-06-07 14:12
0

Po pierwsze po co Ci w funkcji remoteLoad() te linijki:

var that = this;
var result = null;

A po drugie nie mowisz gdzie chcesz wykorzystac ta wartosc resp.
Zauzmy, ze w getData()

async getData(){
let resp = await remoteLoad();
}

Przeciez ta funkcja zwraca ci wartosc resp, wiec ja przypisz do zmiennej

edytowany 1x, ostatnio: Pafker, 2019-06-07 14:23

Pozostało 580 znaków

2019-06-07 14:15
0

Dzieki. Te linijki to pozostałości po pórbach róznego rodzaju
Ale funkcja nie zwraca wartości tylko promise i to jest cały ból - sorry, że o tym nie napisałem, byłoby lepie widać z czym walczę

edytowany 1x, ostatnio: Krajeski, 2019-06-07 14:19
Straszny chaos w opisie problemu :D Nastepnym razem krocej ale konkretniej - Pafker 2019-06-07 14:24
Uwierz na słowo, że to skrócona wersja, mama tendencję do barokowo rozlazłeych opisów i komentarzy - Krajeski 2019-06-07 14:26

Pozostało 580 znaków

2019-06-07 14:15
0
async getData() {
    return this.storageService.areInStorage() ? this.storageService.load('localBooks') : await this.remoteLoad();
}

Pozostało 580 znaków

2019-06-07 14:25
0
Patryk27 napisał(a):
async getData() {
    return this.storageService.areInStorage() ? this.storageService.load('localBooks') : await this.remoteLoad();
}

Wyrzuca błąd SyntaxError: await is only valid in async functions and async generators

Pozostało 580 znaków

2019-06-07 14:25
0

Na pewno masz w swoim kodzie async getData(), tak jak napisałem?


edytowany 1x, ostatnio: Patryk27, 2019-06-07 14:26

Pozostało 580 znaków

2019-06-07 14:32
0
Patryk27 napisał(a):

Na pewno masz w swoim kodzie async getData(), tak jak napisałem?

Przyznaję, że nie miałem, ale jak mam to znowu zwraca promise Dopisże gdzie to widać :


  const egz = new ListModel; console.log(egz.getData())

listModel to nazwa klasy którą ćwiczę i która ma ww metody

edytowany 1x, ostatnio: Krajeski, 2019-06-07 14:33

Pozostało 580 znaków

2019-06-07 14:33
1

W takim wypadku teraz tamtą funkcję musisz zrobić async i napisać await egz.getData() - i tak dalej, i tak dalej.

Innego wyjścia (oprócz wykorzystywania .then(), ofc.) nie ma - once you go async, you never go back.


edytowany 1x, ostatnio: Patryk27, 2019-06-07 14:33

Pozostało 580 znaków

2019-06-07 14:42
0

Żebym się nie pogubił - zatem na samej 'górze'

window.onload = async function() {myFunction()};

async function myFunction() {

  const egz = new ListModel; await console.log(egz.getData())

  }

a w klasie

async remoteLoad(){
var that = this;
var result = null;
    try {
        const x = await fetch('https://api.myjson.com/bins/amapk');
        const resp = await x.json();
        console.log (resp);

        return resp;

        }

        catch(e){console.log(e)}

}

async getData() {
    return this.storageService.areInStorage() ? this.storageService.load('localBooks') : await this.remoteLoad();
}
Jeżeli tak, to nadal zwraca promise. Mi już nie zalezy na eleganckim rozwiązaniu ale by działało - Krajeski 2019-06-07 14:43

Pozostało 580 znaków

2019-06-07 14:43
0
window.onload = function () {
  myFunction()
};

Event handler nie musi być async (chyba że planujesz w nim robić await), reszta wygląda ok.


bez zmiany - wywala promise - Krajeski 2019-06-07 14:45

Pozostało 580 znaków

2019-06-07 15:21
0

W którym miejscu? + pokaż cały kod


edytowany 1x, ostatnio: Patryk27, 2019-06-07 15:21

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0