Javascript 值未超出异步函数的范围

Javascript 值未超出异步函数的范围,javascript,Javascript,我试图调用一个函数,并使用该函数到全局变量的值。问题是价值并没有走出去。我的javascript不太好。我不知道我写的函数是否正确 async function leader(platformName){ let fullUrl = getUrlPrefix(platformName) + "createsessionjson/" + devKey + "/" + sig('createsession') + "/" + timestamp; const response

我试图调用一个函数,并使用该函数到全局变量的值。问题是价值并没有走出去。我的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();

        });

}

这里的全局会话是空的。我想一次性调用Leadboard(),将会话存储在全局会话变量中,并在LeadboardSession()中使用全局会话[我调用LeadboardSession()的次数相同]

我该如何储存它

 var session1;

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

 leaderboard(); // I assume you planned to call it
上面的代码很糟糕,因为它假定
leadboard()
在您在其他地方使用
session1
之前完成,这很容易出错,因为
leadboard()
可能需要比您想象的更长的时间,然后
session1
保持
未定义的状态,并且由于依赖它的函数失败而导致麻烦

因此,您应该始终(大部分/有时)遵循一些小规则,以防止发生sich事件:

1) 不要使用全局变量。 2) 永远不要在异步函数中对它们进行变异

相反,返回异步函数的结果。调用该函数将返回一个承诺,因此如果您这样做:

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

 var session1 = leaderboard();
您立即开始执行排行榜,并且该排行榜只执行一次(您仅称之为一次),但
session1
包含一个承诺,因此您总是知道排行榜()是否已经执行。如果你这样做

 await session1

在另一个异步函数中,该异步函数将在执行排行榜之前停止。这样,如果
leadboard()
尚未完成,所有依赖它的函数都将等待,如果它已完成执行,等待它将立即继续执行。

如何以及何时何地调用leadboard函数?该示例未完成排行榜的
返回会话
,然后执行
var session1=leadboard()和最后的
等待会话1
,只要您想使用it@JonasWilms当然,Leadboard()必须返回一个值,但如何将会话存储到session1?一点confused@Cinah您似乎从未调用过Leadboard()函数。如果不调用该函数,它将不会填充。见我的第一条评论