Javascript 值未超出异步函数的范围
我试图调用一个函数,并使用该函数到全局变量的值。问题是价值并没有走出去。我的javascript不太好。我不知道我写的函数是否正确Javascript 值未超出异步函数的范围,javascript,Javascript,我试图调用一个函数,并使用该函数到全局变量的值。问题是价值并没有走出去。我的javascript不太好。我不知道我写的函数是否正确 async function leader(platformName){ let fullUrl = getUrlPrefix(platformName) + "createsessionjson/" + devKey + "/" + sig('createsession') + "/" + timestamp; const response
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()函数。如果不调用该函数,它将不会填充。见我的第一条评论