未捕获(在承诺中)TypeError:无法在 eval 中设置未定义的属性“playerName”
2019-01-04
5536
我尝试将 GET 请求中的
response.data.Response.displayName
分配给 playerName 属性,但是,我收到错误“
Uncaught (in promise) TypeError: Cannot set property 'playerName' of undefined at eval
”。我已成功将
response.data.Reponse.displayName
记录到控制台,因此其中有一个 displayName。
为什么我会收到此错误?
export default {
data: function() {
return {
playerName: ''
}
},
methods: {
},
mounted() {
axios.get('/User/GetBungieNetUserById/19964531/')
.then(function(response) {
this.playerName = response.data.Response.displayName
console.log(response.data.Response.displayName)
});
}
}
2个回答
其他评论和答案是正确的 - 使用箭头/lambda 函数而不是仅使用
function
即可。但原因却有些微妙。
Javascript 的
this
概念定义明确,但并不总是您期望从其他语言中得到的。当您从诸如回调之类的子函数执行时,
this
可以在一个范围块内更改。在您的情况下,
then
中的函数不再将
this
理解为您直接在
mounted()
内运行相同代码时所理解的。
但是,您可以将函数绑定到(除其他目的外)附加无法更改的特定
this
。箭头函数隐式执行此操作,并将
this
绑定到创建箭头函数的上下文中的
this
。因此,此代码:
axios.get('/User/GetBungieNetUserById/19964531/')
.then((response) => {
this.playerName = response.data.Response.displayName
console.log(response.data.Response.displayName)
});
正确理解了
这个
。它(
大致!
)相当于以下内容:
axios.get('/User/GetBungieNetUserById/19964531/')
.then((function(response) {
this.playerName = response.data.Response.displayName
console.log(response.data.Response.displayName)
}).bind(this));
Michael Pratt
2019-01-04
使用 lambda 函数(箭头函数)到达代码
export default {
data: function() {
return {
playerName: ''
}
},
methods: {
},
mounted() {
axios.get('/User/GetBungieNetUserById/19964531/')
.then((response) => {
self.playerName = response.data.Response.displayName
console.log(response.data.Response.displayName)
});
}
}
Yoarthur
2019-01-04