无法读取未定义的给定属性

anna

我叫this.getAllJobsAPI(); 在渲染功能中。

这将成功调用getAllJobsAPI(如下所示),并且我能够从JSON作业数组中检索作业名称。

getAllJobsAPI(){
var headers = new Headers();
headers.append('Authorization', 'Basic YWRtaW46YWRtaW4=');

fetch('http://localhost:8080/api/json', {headers: headers})
.then((result) => {
  // Get the result
  // If we want text, call result.text()
  return result.json();
}).then((jsonResult) => {
  // get all jobs 
  var jobs = [];

  Object.keys(jsonResult.jobs).forEach(function(key) {
    jobs.push(jsonResult.jobs[key].name);

    var job = jsonResult.jobs[key].name;
    console.log(job);

    this.getLastBuildAPI(job);   

});

//var a = 'meetup';
//this.getLastBuildAPI(a);
console.log(jsonResult);

})
}

但是调用this.getLastBuildAPI(job); 在for每个循环中引发“未捕获(承诺)TypeError:无法读取未定义的属性'getLastBuildAPI'”错误。但是如果我在函数末尾硬编码一个名称变量并调用this.getLastBuildAPI(a); 我可以获得成功的回应。

有人可以告诉我为什么我不能调用this.getLastBuildAPI(job); 在每个JSON数组?请注意,我能够在控制台中看到作业变量。

谢谢,

阿德林

因为this在resolve回调内部是undefined(因为它是不同的上下文),所以当它在回调外部时this是您期望的对象。您可以先引用thisvar存储它。

getAllJobsAPI(){
var headers = new Headers();
headers.append('Authorization', 'Basic YWRtaW46YWRtaW4=');
var self = this;

fetch('http://localhost:8080/api/json', {headers: headers})
.then((result) => {
  // Get the result
  // If we want text, call result.text()
  return result.json();
}).then((jsonResult) => {
  // get all jobs 
  var jobs = [];

  Object.keys(jsonResult.jobs).forEach(function(key) {
    jobs.push(jsonResult.jobs[key].name);

    var job = jsonResult.jobs[key].name;
    console.log(job);

    self.getLastBuildAPI(job);   

});

//var a = 'meetup';
//this.getLastBuildAPI(a);
console.log(jsonResult);

})

您还可以应用其他方法。

1.使用bind方法。

bind()方法创建一个新函数,该函数在被调用时将其关键字设置为提供的值,并在调用新函数时提供给定的参数序列。

Object.keys(jsonResult.jobs).forEach(function(key) {
    jobs.push(jsonResult.jobs[key].name);
    var job = jsonResult.jobs[key].name;
    console.log(job);
    this.getLastBuildAPI(job);   
}.bind(this));

2.使用arrow功能。

在使用arrow函数之前,每个new 函数都定义了自己的this值。

例如,对于this构造函数可以是新对象。

function Person(age){
  this.age=age;
  console.log(this);
}
let person=new Person(22);

或者this可以base对象,如果创建的函数可以像访问obj.getAge()

let obj={
  getAge:function(){
    console.log(this);
    return 22;
  }
}
console.log(obj.getAge());

arrow函数不会创建自己函数this,而只是使用执行this另一方面,父作用域的功能使用enclosingcontextarrowthis

Object.keys(jsonResult.jobs).forEach((key) => {
jobs.push(jsonResult.jobs[key].name);
   var job = jsonResult.jobs[key].name;
   console.log(job);
   this.getLastBuildAPI(job);   
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章