值不超出异步功能

时间:2018-11-01 15:30:37

标签: javascript

我正在尝试调用一个函数,并将该函数中的值用于全局变量。问题是价值没有超出范围。我的JavaScript不太好。我不知道我是否正确编写了函数。

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();

        });

}

Output i am getting

此处全局会话为空。我想一次调用leaderboard(),将会话存储在全局会话变量中,并在leaderboardsession()中使用全局会话(与我多次调用leaderboardsession()一样。)。

我该如何存储?

1 个答案:

答案 0 :(得分:1)

 var session1;

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

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

上面的代码很糟糕,因为它假定leaderboard()在您在其他地方使用session1之前完成,并且很容易出错,因为leaderboard()可能会花费更长的时间,然后session1停留在undefined并由于依赖它的功能失败而引起麻烦。

因此,您应始终(/通常/有时)遵循一些小规矩,以防止类似的事情发生:

1)不要使用全局变量。 2)永远不要从异步函数内部对其进行变异。

代替return来自异步函数的结果。调用该函数将返回Promise,因此,如果这样做:

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

 var session1 = leaderboard();

您立即开始执行排行榜,并且将只执行一次(就像您只调用一次一样),但是session1包含一个诺言,因此您始终知道Leaderboard()是否已经完成。如果你这样做

 await session1

在另一个异步函数中,该异步函数将在那里停止,直到执行排行榜。这样,如果leaderboard()尚未完成,则依赖它的所有功能都将等待,如果已经等待执行完成,它将立即进行。