我在访问对象时遇到麻烦,我试图定义一个let
并向它写入一个新对象,但是当我尝试访问它时,这是不可能的,这就是我的尝试: / p>
function Player(uniqueId, name, figureString, motto, memberSince) {
this.uniqueId = uniqueId;
this.name = name;
this.figureString = figureString;
this.motto = motto;
this.memberSince = memberSince;
}
...
let player;
getUser
.then((res) => {
player = new Player(res.uniqueId, res.name, res.figureString, res.motto, res.memberSince);
})
.catch(() => {
...
});
// Trying to access player here
console.log(player.name + player.figureString);
答案 0 :(得分:0)
您正在尝试对console.log
进行异步函数调用之后再调用getUser
。 player
可能仍未定义,因为getUser
尚未解析(此时)设置player = new Player(...)
。如果您调整代码以遵循异步流程并重新分配播放器变量后登录then
,则应该可以访问它。
答案 1 :(得分:0)
当您声明let player
时,它具有窗口范围,因此我希望可以从任何地方访问它。我希望get user是ajax调用,可能是您在从服务器获取值之前运行console.log(player.name + player.figureString);
。因此,您可以按照以下方式进行操作,如下所示,可以在console.log(player.name + player.figureString);
then
内使用function
。
function Player(uniqueId, name, figureString, motto, memberSince) {
this.uniqueId = uniqueId;
this.name = name;
this.figureString = figureString;
this.motto = motto;
this.memberSince = memberSince;
}
...
let player;
getUser
.then((res) => {
player = new Player(res.uniqueId, res.name, res.figureString, res.motto, res.memberSince);
// once res is populated
console.log(player.name + player.figureString);
})
.catch(() => {
...
});
// Trying to acces player here
console.log(player.name + player.figureString);
答案 2 :(得分:0)
和其他人一样,问题出在library(tidyverse)
d %>%
map(~filter(.,1:n() != 1 | b != 2006))
[[1]]
a b
1 2.14889697 2006
2 0.05842311 2006
3 1.89911545 2006
4 -0.16836139 NA
[[2]]
a b
1 1 2007
2 2 2007
3 3 NA
4 4 NA
5 5 2007
和异步代码上。因此,在调用console.log(...)
时未定义播放器。为避免这种情况,您可以使用console.log()
。
async/await
不是我添加了getUser存根和简化示例以仅使用function Player(id, name) {
this.name = name;
this.id = id;
}
const getUser = () => {
return new Promise((resolve, reject) => {
return resolve({ name: "Karl", id: 1 });
});
}
(async () => {
try {
const { name, id } = await getUser();
const player = new Player(id, name);
console.log(`id: ${player.id}, name: ${player.name}`);
} catch (err) {
//handle error
}
})();
和name
。最后,您可以看到IIFE,因为要使用id
关键字,它必须放在await
函数内部。这样,您可以确定已定义播放器。