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 15:41
0

Wywaliłem wszystko co by zamącało

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="./modernizr-custom.js"></script>

    <title>Document</title>
</head>
<body>

<script src= './script.js'></script>
</body>
</html>
window.onload = function() {myFunction()};

async function myFunction(location) {
const egz = new ListModel; await console.log(egz.getData())

  }

class EventEmitter {
    constructor() {
      this._events = {};
    }

    on(evt, listener) {
      (this._events[evt] || (this._events[evt] = [])).push(listener);
      return this;
    }

    emit(evt, arg) {
      (this._events[evt] || []).slice().forEach(lsn => lsn(arg));
    }
  }

class ListModel extends EventEmitter {
    constructor(items) {
      super();

      this.sessionStorage = Modernizr.sessionstorage;
      this.temp= null;

    }

async remoteLoad(){

    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  await this.remoteLoad();
}

}

Pozostało 580 znaków

2019-06-07 15:44
1
await console.log(egz.getData())

vs

console.log(await egz.getData())

Już drugi raz podałem Ci wprost to, co musisz napisać, i drugi raz zrobiłeś to źle ;-p


edytowany 2x, ostatnio: Patryk27, 2019-06-07 15:45

Pozostało 580 znaków

2019-06-07 16:00
0

Działa !!!!
Pytanie jak z tym dalej. Czy każde wywołanie metody modelu będę musiał poprzedzać await -em? Czy jeżeli je będę definiował - bo na razie to golizna - to też wszedzie await?

Przecież Ci Patryk napisał: once you go async, you never go back. Albo callback hell, albo promises albo await. Najbardziej eleganckie jest await chociaż obietnice też są ok. Nie bój się ich. Nie ugryzą. - siloam 2019-06-07 18:19

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