Angular 无法访问属性对象Typescript
我需要编写一些对象数组和接口数组来使用Angular应用程序执行我的项目,但我必须面对关于值的错误。我尝试了3种代码替代方案: 弗斯特 我不明白为什么物体没有返回 这是我的输出: 代码如下: 主分量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
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()
调用之后循环值。