如何管理 ionic 2 中的下载数据
How to manage downloading data in ionic 2
我在管理将 firebase 的数据下载到我的离子应用程序时遇到了小问题。
例如:在正常情况下[例如下面的代码],下载数据是正常的[例如这张图片]
constructor(...){
this.questionsList = this.afd.list('/questions/');
}
但是如果我使用"setInterval"[比如下面的代码],下载数据会增加[比如这个图片]
constructor(...){
this.questionsList = this.afd.list('/questions/');
this.favoritesList = this.afd.list('/favorites/',{
query:{
orderByChild:'user_id',
equalTo: userService.id,
}
})
this.joinObjects();
this.refreshIntervalId=setInterval(()=>{
this.joinObjects();
},250);
}
joinObjects(){
let TempListX=[];
this.favoritesList.take(1).subscribe(data1=>{
this.questionsList.take(1).subscribe(data2=>{
TempListX = data1.slice(0);
for(let i=0; i<data1.length; i++){
for(let j=0; j<data2.length; j++){
if(data1[i].question_id==data2[j].$key){
TempListX[i].qTitle=data2[j].title;
}
}
}
if (JSON.stringify(TempListX)===JSON.stringify(this.TempFavoritesList)) {
}else{
this.TempFavoritesList=TempListX.slice();
}
})
})
}
那么有什么办法可以让下载的数据像正常情况一样吗?
这里要求的是您的代码的重构版本。我不得不说我没有测试它,但它应该概述了这个概念。每次更新的 value/list 到达时都会调用方法 joinObjects()
,而不是在固定的时间间隔内调用,这会产生大量开销。请注意我添加的新实例变量,并将您的可观察对象重命名为 favoritesList$
和 questionsList$
(美元后缀是一种很好的做法,表明它是可观察对象(不是订阅、值...) .
public questions;
public favorites;
constructor(...) {
this.questionsList$ = this.afd.list('/questions/');
this.favoritesList$ = this.afd.list('/favorites/', {
query: {
orderByChild: 'user_id',
equalTo: userService.id,
},
});
this.questionsList$.subscribe(updatedList => {
this.questions = updatedList;
this.joinObjects();
});
this.favoritesList$.subscribe(updatedList => {
this.favorites = updatedList;
this.joinObjects();
});
}
joinObjects() {
let TempListX = [];
TempListX = this.questions.slice(0);
for (let i = 0; i < this.questions.length; i++) {
for (let j = 0; j < this.favorites.length; j++) {
if (this.questions[i].question_id == this.favorites[j].$key) {
TempListX[i].qTitle = this.favorites[j].title;
}
}
}
if (JSON.stringify(TempListX) === JSON.stringify(this.TempFavoritesList)) {
} else {
this.TempFavoritesList = TempListX.slice();
}
}
希望这能让您离目标更近一些!
我在管理将 firebase 的数据下载到我的离子应用程序时遇到了小问题。
例如:在正常情况下[例如下面的代码],下载数据是正常的[例如这张图片]
constructor(...){
this.questionsList = this.afd.list('/questions/');
}
但是如果我使用"setInterval"[比如下面的代码],下载数据会增加[比如这个图片]
constructor(...){
this.questionsList = this.afd.list('/questions/');
this.favoritesList = this.afd.list('/favorites/',{
query:{
orderByChild:'user_id',
equalTo: userService.id,
}
})
this.joinObjects();
this.refreshIntervalId=setInterval(()=>{
this.joinObjects();
},250);
}
joinObjects(){
let TempListX=[];
this.favoritesList.take(1).subscribe(data1=>{
this.questionsList.take(1).subscribe(data2=>{
TempListX = data1.slice(0);
for(let i=0; i<data1.length; i++){
for(let j=0; j<data2.length; j++){
if(data1[i].question_id==data2[j].$key){
TempListX[i].qTitle=data2[j].title;
}
}
}
if (JSON.stringify(TempListX)===JSON.stringify(this.TempFavoritesList)) {
}else{
this.TempFavoritesList=TempListX.slice();
}
})
})
}
那么有什么办法可以让下载的数据像正常情况一样吗?
这里要求的是您的代码的重构版本。我不得不说我没有测试它,但它应该概述了这个概念。每次更新的 value/list 到达时都会调用方法 joinObjects()
,而不是在固定的时间间隔内调用,这会产生大量开销。请注意我添加的新实例变量,并将您的可观察对象重命名为 favoritesList$
和 questionsList$
(美元后缀是一种很好的做法,表明它是可观察对象(不是订阅、值...) .
public questions;
public favorites;
constructor(...) {
this.questionsList$ = this.afd.list('/questions/');
this.favoritesList$ = this.afd.list('/favorites/', {
query: {
orderByChild: 'user_id',
equalTo: userService.id,
},
});
this.questionsList$.subscribe(updatedList => {
this.questions = updatedList;
this.joinObjects();
});
this.favoritesList$.subscribe(updatedList => {
this.favorites = updatedList;
this.joinObjects();
});
}
joinObjects() {
let TempListX = [];
TempListX = this.questions.slice(0);
for (let i = 0; i < this.questions.length; i++) {
for (let j = 0; j < this.favorites.length; j++) {
if (this.questions[i].question_id == this.favorites[j].$key) {
TempListX[i].qTitle = this.favorites[j].title;
}
}
}
if (JSON.stringify(TempListX) === JSON.stringify(this.TempFavoritesList)) {
} else {
this.TempFavoritesList = TempListX.slice();
}
}
希望这能让您离目标更近一些!