我有一个Firebase服务提供程序函数,它通过promise对象返回一组数据:
getPreviousChats(groupKey: string, offset: string): Promise<any> {
return new Promise((resolve, reject) => {
// let previousChats: Array<any> = [];
let previousChats: any[] = [];
const chatRef = this.chatsRef.child(groupKey).orderByKey().endAt(offset).limitToLast(5);
chatRef.once('value', snapshot => {
snapshot.forEach(childSnapshot => {
previousChats.push({
id: childSnapshot.key,
message: childSnapshot.val().message,
createTime: childSnapshot.val().createTime
});
return false; // forEach returns boolean
});
});
resolve(previousChats);
});
}
同时,Ionic页面功能调用getPreviousChats()
来检索以前的聊天数据,并通过unshift()
将其添加到当前页面布局中:
loadPreviousChats(refresher) {
this.dataService.getPreviousChats(this.groupKey, this.chats[0].id).then(data => {
this.chats.unshift(data);
}, (error) => {
console.log('loadPreviousChats error: ', JSON.stringify(error));
});
setTimeout(() => {
console.log('Async operation has ended');
refresher.complete();
}, 1000);
}
不幸的是,不知怎的this.chats.unshift(data);
将data
插入到当前this.chats
数组的前面,并增加了一层数组:
this.chats: Array[6]
0: Array[5]
0: Object
1: Object
2: Object
3: Object
4: Object
length: 5
__proto__: Array[0]
1: Object
2: Object
3: Object
4: Object
5: Object
length: 6
__proto__: Array[0]
那么,我在这里错过了什么?
答案 0 :(得分:1)
那么,我在这里错过了什么?
这就是unshift
的作用:它取你给它的值并将其插入数组的开头。你给它的值是一个数组引用,所以它在数组中的含义。
如果您想将这些条目附加到this.chats
,您可以使用push
执行此操作;在ES5及更早版本中它有点尴尬:
this.chats.push.apply(this.chats, data);
在ES2015 +中使用扩展语法更加清晰:
this.chats.push(...data);
附注:您还会成为this problem的牺牲品:在调用getPreviousChats
回调之前,您在once
过早解决您的承诺(I&I #39; m假设它是异步操作,否则使用类似的回调似乎很奇怪。将resolve
电话移至回调中。
答案 1 :(得分:1)
我想你可以将新的数组项插入现有的数组:
let chats = [...newChats, ...oldChats]; //or oldChats first
或者,你可以像这样使用concat:
let chats = oldChats.concat(newChats);
我更喜欢方法一,因为它创建了每个数组的吞咽副本,而不修改原件。