我正在尝试调用一个函数,并将该函数中的值用于全局变量。问题是价值没有超出范围。我的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();
});
}
此处全局会话为空。我想一次调用leaderboard(),将会话存储在全局会话变量中,并在leaderboardsession()中使用全局会话(与我多次调用leaderboardsession()一样。)。
我该如何存储?
答案 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()
尚未完成,则依赖它的所有功能都将等待,如果已经等待执行完成,它将立即进行。