Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 无法访问属性对象Typescript_Angular_Typescript - Fatal编程技术网

Angular 无法访问属性对象Typescript

Angular 无法访问属性对象Typescript,angular,typescript,Angular,Typescript,我需要编写一些对象数组和接口数组来使用Angular应用程序执行我的项目,但我必须面对关于值的错误。我尝试了3种代码替代方案: 弗斯特 我不明白为什么物体没有返回 这是我的输出: 代码如下: 主分量 onSearch(){ this.indexingQuery(this.search); // for spliting the input user and check the word let cek = this.dbService.checkTerm(); cek.then( (d

我需要编写一些对象数组和接口数组来使用Angular应用程序执行我的项目,但我必须面对关于值的错误。我尝试了3种代码替代方案:

弗斯特 我不明白为什么物体没有返回

这是我的输出:

代码如下:

主分量

  onSearch(){
this.indexingQuery(this.search); // for spliting the input user and check the word
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      console.log(a);
      console.log("a");
      this.termFA.push(a);
    }
    this.termFA.forEach(element=>{
      console.log(element);
      console.log(element.freq);
    });

  }
);}
onSearch(){
this.indexingQuery(this.search);
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      this.termFA.push(a);
      console.log(a);
      console.log("a");
    }
    this.termFA.forEach(element=>{
      console.log("Arrghh");
      console.log(element);
      console.log(element.freq);
    });

  }
);}
onSearch(){
this.indexingQuery(this.search);
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      console.log(index);
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      a.then((data)=>{
        console.log("data");
        console.log(data);
        let b = this.termFA.push(data);
      });
    }
    console.log("this.termFA");
    console.log(this.termFA);
    this.termFA.forEach(element=>{
      console.log("Arrghh");
      console.log(element);
      console.log(element.freq);
    });
    console.log("this.termFA2");
    console.log(this.termFA);
    for(let i in this.termFA){
      console.log("loop");
      console.log(this.termFA[i]);
      console.log(this.termFA[i].freq);
    }
  }
);}
数据库服务

ReadTermPerDocumentFreq(kata:string):TermFreqAll{
let temp:TermFreqAll ;
this.afDb.database.ref('/term_freq_all/'+kata).
once('value', function(snapshot){
  let userData : any= snapshot.val();
  temp = new TermFreqAll(
    userData.word,
    userData.doc_freq,
    userData.freq,
    userData.docs
  );
  console.log("temp");
  console.log(temp);
  console.log("temp");
});
console.log(temp);
return temp;}
ReadTermPerDocumentFreq(kata:string):TermFreqAll{
let temp:TermFreqAll = new TermFreqAll();
this.afDb.database.ref('/term_freq_all/'+kata).
once('value', function(snapshot){
  let userData : any= snapshot.val();
  temp.freq = userData.freq;
  temp.docs = userData.docs;
  temp.doc_freq = userData.doc_freq;
  temp.word = userData.word;
  console.log("temp");
  console.log(temp);
  console.log("temp");
});
console.log(temp);
return temp;}
ReadTermPerDocumentFreq(kata:string):Promise<TermFreqAll>{
return new Promise((resolve, reject)=>{
  this.afDb.database.ref('/term_freq_all/'+kata).once("value",snapshot => {
      let userData : any= snapshot.val();
      // console.log(userData);
      if (userData){
        console.log("userdata");
        console.log(userData);
        let temp : TermFreqAll = new TermFreqAll();
        temp.freq = userData.freq;
        temp.docs = userData.docs;
        temp.doc_freq = userData.doc_freq;
        temp.word = userData.word;
        // console.log("true");
        resolve(temp);
      }
      else{
        let temp : TermFreqAll = new TermFreqAll();
        resolve(temp);
      }
  }).catch(error=>{
      let temp : TermFreqAll = new TermFreqAll();
      resolve(temp);
  });
});}
第二 如果我像这样修改代码。它将被归还,但我无法得到财产

这是输出:

以及守则:

主分量

  onSearch(){
this.indexingQuery(this.search); // for spliting the input user and check the word
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      console.log(a);
      console.log("a");
      this.termFA.push(a);
    }
    this.termFA.forEach(element=>{
      console.log(element);
      console.log(element.freq);
    });

  }
);}
onSearch(){
this.indexingQuery(this.search);
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      this.termFA.push(a);
      console.log(a);
      console.log("a");
    }
    this.termFA.forEach(element=>{
      console.log("Arrghh");
      console.log(element);
      console.log(element.freq);
    });

  }
);}
onSearch(){
this.indexingQuery(this.search);
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      console.log(index);
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      a.then((data)=>{
        console.log("data");
        console.log(data);
        let b = this.termFA.push(data);
      });
    }
    console.log("this.termFA");
    console.log(this.termFA);
    this.termFA.forEach(element=>{
      console.log("Arrghh");
      console.log(element);
      console.log(element.freq);
    });
    console.log("this.termFA2");
    console.log(this.termFA);
    for(let i in this.termFA){
      console.log("loop");
      console.log(this.termFA[i]);
      console.log(this.termFA[i].freq);
    }
  }
);}
数据库服务

ReadTermPerDocumentFreq(kata:string):TermFreqAll{
let temp:TermFreqAll ;
this.afDb.database.ref('/term_freq_all/'+kata).
once('value', function(snapshot){
  let userData : any= snapshot.val();
  temp = new TermFreqAll(
    userData.word,
    userData.doc_freq,
    userData.freq,
    userData.docs
  );
  console.log("temp");
  console.log(temp);
  console.log("temp");
});
console.log(temp);
return temp;}
ReadTermPerDocumentFreq(kata:string):TermFreqAll{
let temp:TermFreqAll = new TermFreqAll();
this.afDb.database.ref('/term_freq_all/'+kata).
once('value', function(snapshot){
  let userData : any= snapshot.val();
  temp.freq = userData.freq;
  temp.docs = userData.docs;
  temp.doc_freq = userData.doc_freq;
  temp.word = userData.word;
  console.log("temp");
  console.log(temp);
  console.log("temp");
});
console.log(temp);
return temp;}
ReadTermPerDocumentFreq(kata:string):Promise<TermFreqAll>{
return new Promise((resolve, reject)=>{
  this.afDb.database.ref('/term_freq_all/'+kata).once("value",snapshot => {
      let userData : any= snapshot.val();
      // console.log(userData);
      if (userData){
        console.log("userdata");
        console.log(userData);
        let temp : TermFreqAll = new TermFreqAll();
        temp.freq = userData.freq;
        temp.docs = userData.docs;
        temp.doc_freq = userData.doc_freq;
        temp.word = userData.word;
        // console.log("true");
        resolve(temp);
      }
      else{
        let temp : TermFreqAll = new TermFreqAll();
        resolve(temp);
      }
  }).catch(error=>{
      let temp : TermFreqAll = new TermFreqAll();
      resolve(temp);
  });
});}
第三 我试图回报数据库服务的承诺。该值为,可以推入TermFA数组,但无法在循环中获取该值。与第二次尝试的情况相同。它表示数组长度为0

这是我的输出

这是代码:

主分量

  onSearch(){
this.indexingQuery(this.search); // for spliting the input user and check the word
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      console.log(a);
      console.log("a");
      this.termFA.push(a);
    }
    this.termFA.forEach(element=>{
      console.log(element);
      console.log(element.freq);
    });

  }
);}
onSearch(){
this.indexingQuery(this.search);
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      this.termFA.push(a);
      console.log(a);
      console.log("a");
    }
    this.termFA.forEach(element=>{
      console.log("Arrghh");
      console.log(element);
      console.log(element.freq);
    });

  }
);}
onSearch(){
this.indexingQuery(this.search);
let cek = this.dbService.checkTerm();
cek.then(
  (data)=>{
    for(var index in this.term) { 
      console.log(index);
      let a = this.dbService.ReadTermPerDocumentFreq(index);
      a.then((data)=>{
        console.log("data");
        console.log(data);
        let b = this.termFA.push(data);
      });
    }
    console.log("this.termFA");
    console.log(this.termFA);
    this.termFA.forEach(element=>{
      console.log("Arrghh");
      console.log(element);
      console.log(element.freq);
    });
    console.log("this.termFA2");
    console.log(this.termFA);
    for(let i in this.termFA){
      console.log("loop");
      console.log(this.termFA[i]);
      console.log(this.termFA[i].freq);
    }
  }
);}
数据库服务

ReadTermPerDocumentFreq(kata:string):TermFreqAll{
let temp:TermFreqAll ;
this.afDb.database.ref('/term_freq_all/'+kata).
once('value', function(snapshot){
  let userData : any= snapshot.val();
  temp = new TermFreqAll(
    userData.word,
    userData.doc_freq,
    userData.freq,
    userData.docs
  );
  console.log("temp");
  console.log(temp);
  console.log("temp");
});
console.log(temp);
return temp;}
ReadTermPerDocumentFreq(kata:string):TermFreqAll{
let temp:TermFreqAll = new TermFreqAll();
this.afDb.database.ref('/term_freq_all/'+kata).
once('value', function(snapshot){
  let userData : any= snapshot.val();
  temp.freq = userData.freq;
  temp.docs = userData.docs;
  temp.doc_freq = userData.doc_freq;
  temp.word = userData.word;
  console.log("temp");
  console.log(temp);
  console.log("temp");
});
console.log(temp);
return temp;}
ReadTermPerDocumentFreq(kata:string):Promise<TermFreqAll>{
return new Promise((resolve, reject)=>{
  this.afDb.database.ref('/term_freq_all/'+kata).once("value",snapshot => {
      let userData : any= snapshot.val();
      // console.log(userData);
      if (userData){
        console.log("userdata");
        console.log(userData);
        let temp : TermFreqAll = new TermFreqAll();
        temp.freq = userData.freq;
        temp.docs = userData.docs;
        temp.doc_freq = userData.doc_freq;
        temp.word = userData.word;
        // console.log("true");
        resolve(temp);
      }
      else{
        let temp : TermFreqAll = new TermFreqAll();
        resolve(temp);
      }
  }).catch(error=>{
      let temp : TermFreqAll = new TermFreqAll();
      resolve(temp);
  });
});}
ReadTermPerDocumentFreq(kata:string):承诺{
返回新承诺((解决、拒绝)=>{
this.afDb.database.ref('/term\u freq\u all/'+kata).once(“value”,snapshot=>{
让userData:any=snapshot.val();
//console.log(userData);
如果(用户数据){
console.log(“用户数据”);
console.log(userData);
设temp:TermFreqAll=新的TermFreqAll();
temp.freq=userData.freq;
temp.docs=userData.docs;
temp.doc\u freq=userData.doc\u freq;
temp.word=userData.word;
//console.log(“真”);
解决(临时);
}
否则{
设temp:TermFreqAll=新的TermFreqAll();
解决(临时);
}
}).catch(错误=>{
设temp:TermFreqAll=新的TermFreqAll();
解决(临时);
});
});}

上次尝试的问题是,您在第一个循环中调用了一个异步数据库函数。您希望它的结果在每个循环之后都已经存在,但它们不是,因为
then
is函数是异步的,以后可能会调用它。 现在,循环不再等待结果,而是继续触发更多的数据库调用,完成后,您将尝试访问
termFA
数组,但可能尚未执行填充此数组的任何结果函数

这里有一个解决这个问题的选项。您可以收集这些承诺并使用
Promise.all()
调用来执行它们,而不是直接对第一个循环中的承诺做出反应。通过这种方式,您可以轻松地一次对所有promise返回做出反应,并且手头上有一个完成且填充的结果数组

let promiseArray:Promise<TermFreqAll>[]=[];
for(var index in this.term) { 
  console.log(index);
 // save it in an array to combine all executes after the loop has finished
 promiseArray.push(this.dbService.ReadTermPerDocumentFreq(index));
}

// now execute them and wait till they are all returned
Promise.all(promiseArray).then(values=>{
  // when everything has returned, you can react to it as if you had filled your array;
  // "values" is an array of all results, what probably is equal to your "termFA" array
  values.forEach(element=>{
    console.log("Arrghh");
    console.log(element);
    console.log(element.freq);
  });
}
let promiseArray:Promise[]=[];
对于(此项中的var索引){
控制台日志(索引);
//将其保存在数组中,以便在循环完成后合并所有执行
push(this.dbService.ReadTermPerDocumentFreq(index));
}
//现在执行它们并等待它们全部返回
promiseArray.then(值=>{
//当一切都回来了,你可以对它做出反应,就好像你已经填满了你的数组;
//“values”是所有结果的数组,可能等于“termFA”数组
values.forEach(元素=>{
控制台日志(“Arrghh”);
控制台日志(元素);
console.log(element.freq);
});
}
有关
承诺的更多信息。您可以查看所有
功能


希望这能有所帮助。如果有什么不清楚的地方,请告诉我。

谢谢你改进我的文字@xg.plt.pyNo problem!我对angular和typescript都不太了解,我也不确定,但我想除了你尝试过的代码之外,还没有包括你想要的输出@BenediktSchmidt先生之前运行的代码。我尝试过=-我添加了输入
让promiseArray=[];
像这样
让promiseArray:TermFreqAll=[];
-将
this.termFA
更改为上面代码中的
,结果相同,promiseArray的长度为0我尝试再次调用它
让a=this.dbService.ReadTermPerDocumentFreq(index);a.then((数据)=>{//to get atribut});
它可以工作。但是为什么我必须首先调用它。该函数只返回
promise
我已经更新了我的代码。数组应该是
promise[]
类型,不确定这是否解决了问题。是的,我们在
promise.all()
调用之后循环值。