可观察到的混乱
Observable Confusion
我正在使用 Ionic2
和 AngularFire2
。
我也在使用 rxjs
Observable
。我有以下代码:
findChatsForUid(uid: string): Observable<any[]> {
return this.af.database.list('/chat/', {
query: {
orderByChild: 'negativtimestamp'
}
}).map(items => {
const filtered = items.filter(
item => (item.memberId1 === uid || item.memberId2 === uid)
);
return filtered;
});
}
和
deleteChatsAndMessagesForUid(uid: string): Promise<any> {
return new Promise<any>((resolve) => {
let promiseArray: Promise<any>[] = [];
this.findChatsForUid(uid).map(items => {
return items;
}).forEach((chatItems) => {
for (let i: number = 0; i < chatItems.length; i++) {
promiseArray.push(this.deleteChat(chatItems[i], true));
}
Promise.all(promiseArray).then(() => {
resolve(true);
});
});
});
}
在第二个函数中,您可以看到我从第一个函数中检索 Observable
,并使用 forEach
函数循环遍历每个项目。
我的问题是,因为这是一个 Observable
,所以总是有对象的句柄。所以当我执行以下操作时:
deleteChatsAndMessagesForUid(uid).then(() => {
user.delete().then(() => {
...
}
}
它导致以下错误,因为已删除的用户仍在尝试观察 Observable
。
Error: Uncaught (in promise): Error: permission_denied at /chat:
Client doesn't have permission to access the desired data. Error:
permission_denied at /chat: Client doesn't have permission to access
the desired data.
问题
有没有办法在不附加到 Observable
的情况下检索数据?这样我就可以自由删除关联用户了?或者有更好的方法来处理这个问题吗?
谢谢
听起来您想在第一个发出的列表之后取消订阅 list
observable。
您可以使用 first
运算符在第一个发出的列表之后完成 list
observable。这将导致自动取消订阅,并且将从内部 Firebase 引用中删除侦听器。
import 'rxjs/add/operator/first';
findChatsForUid(uid: string): Observable<any[]> {
return this.af.database
.list('/chat/', {
query: {
orderByChild: 'negativtimestamp'
}
})
.first()
.map(items => {
const filtered = items.filter(
item => (item.memberId1 === uid || item.memberId2 === uid)
);
return filtered;
});
}
我正在使用 Ionic2
和 AngularFire2
。
我也在使用 rxjs
Observable
。我有以下代码:
findChatsForUid(uid: string): Observable<any[]> {
return this.af.database.list('/chat/', {
query: {
orderByChild: 'negativtimestamp'
}
}).map(items => {
const filtered = items.filter(
item => (item.memberId1 === uid || item.memberId2 === uid)
);
return filtered;
});
}
和
deleteChatsAndMessagesForUid(uid: string): Promise<any> {
return new Promise<any>((resolve) => {
let promiseArray: Promise<any>[] = [];
this.findChatsForUid(uid).map(items => {
return items;
}).forEach((chatItems) => {
for (let i: number = 0; i < chatItems.length; i++) {
promiseArray.push(this.deleteChat(chatItems[i], true));
}
Promise.all(promiseArray).then(() => {
resolve(true);
});
});
});
}
在第二个函数中,您可以看到我从第一个函数中检索 Observable
,并使用 forEach
函数循环遍历每个项目。
我的问题是,因为这是一个 Observable
,所以总是有对象的句柄。所以当我执行以下操作时:
deleteChatsAndMessagesForUid(uid).then(() => {
user.delete().then(() => {
...
}
}
它导致以下错误,因为已删除的用户仍在尝试观察 Observable
。
Error: Uncaught (in promise): Error: permission_denied at /chat: Client doesn't have permission to access the desired data. Error: permission_denied at /chat: Client doesn't have permission to access the desired data.
问题
有没有办法在不附加到 Observable
的情况下检索数据?这样我就可以自由删除关联用户了?或者有更好的方法来处理这个问题吗?
谢谢
听起来您想在第一个发出的列表之后取消订阅 list
observable。
您可以使用 first
运算符在第一个发出的列表之后完成 list
observable。这将导致自动取消订阅,并且将从内部 Firebase 引用中删除侦听器。
import 'rxjs/add/operator/first';
findChatsForUid(uid: string): Observable<any[]> {
return this.af.database
.list('/chat/', {
query: {
orderByChild: 'negativtimestamp'
}
})
.first()
.map(items => {
const filtered = items.filter(
item => (item.memberId1 === uid || item.memberId2 === uid)
);
return filtered;
});
}