Próbuję wywołać funkcję i użyć wartości z tej funkcji do zmiennej globalnej. Problem polega na tym, że wartość nie wychodzi na zewnątrz. Nie jestem zbyt dobry w javascript. Nie wiem, czy poprawnie napisałem funkcję.

async function leader(platformName){

let fullUrl = getUrlPrefix(platformName) + "createsessionjson/" + devKey + "/" + sig('createsession') + "/" + timestamp;


        const response = await fetch(fullUrl, { method: 'GET' });
        const json = await response.json();
        console.log(json);
        console.log(json.session_id);
        return (json.session_id);



}
var session1 = ''; 

export async function leaderboard (platformName) {

    var session =  await leader(platformName);
    console.log("Session" + ":" + " " + session);
    session1 = session;
}

export function leaderboardsession (platformName) {

    console.log("Global session" + ":" + " " + session1);
    let fullUrl1 =  getUrlPrefix(platformName) + "getleagueleaderboardjson/" + devKey + "/" + sig('getleagueleaderboard') + "/" + session1 + "/" + timestamp + "/" + 428 + "/" + 27 + "/" + 2;

    console.log("this is inner url ->" + "\n" + fullUrl1);
    return (fetch(fullUrl1, { method: 'GET' }))

        .then(function (response) {
            return response.json();

        });

}

Wynik, który otrzymuję

Tutaj sesja globalna jest pusta. Chcę jednorazowo wywołać Leaderboard(), zapisać sesję w globalnej zmiennej sesji i użyć globalnej sesji w Leaderboardsession() [tyle razy, ile wywołam Leaderboardsession()].

Jak to przechowywać?

0
Cinah 1 listopad 2018, 18:30

1 odpowiedź

Najlepsza odpowiedź
 var session1;

 async function leaderboard() {
   // something async that is finisjed *somewhen*
   session1 = session;
 }

 leaderboard(); // I assume you planned to call it

Powyższy kod jest zły, ponieważ zakłada, że ​​leaderboard() kończy się, zanim użyjesz session1 w innym miejscu i jest to dość podatne na błędy, ponieważ leaderboard() może potrwać dłużej, niż zakładasz, a następnie session1 pozostaje undefined i powoduje problemy, ponieważ funkcje na nim oparte zawodzą.

Dlatego kilka małych zasad, których należy zawsze (/w większości/czasami) przestrzegać, aby zapobiec takim rzeczom:

1) Nie używaj zmiennych globalnych. 2) I nigdy nie mutuj ich od wewnątrz funkcji asynchronicznej.

Zamiast tego return wyniki z funkcji asynchronicznej. Wywołanie funkcji zwróci Promise, więc jeśli to zrobisz:

 async function leaderboard() {
   //...
   return session;
 }

 var session1 = leaderboard();

Natychmiast zaczynasz wykonywać tablicę wyników, która zostanie wykonana tylko raz (jak to tylko raz nazywasz), ale session1 zawiera obietnicę, więc zawsze wiesz, czy Leaderboard() jest już zrobione. Jeśli zrobisz

 await session1

Wewnątrz innej funkcji asynchronicznej, ta funkcja asynchroniczna zatrzyma się tam, dopóki nie zostanie wykonane wykonanie tabeli liderów. W ten sposób, jeśli leaderboard() nie zostało jeszcze zrobione, wszystkie zależne od niego funkcje będą czekać, jeśli zakończy się wykonywanie, już czekając, będą działać natychmiast.

1
Jonas Wilms 1 listopad 2018, 19:21