我有以下代码:
//Loop: For each user ID/Role ID, get the data
userMeta.forEach((businessRole) => {
Observable.forkJoin(
af.database.object('/roles/'+businessRole.$value),
af.database.object('/users/'+businessRole.$key)
).subscribe(
data => {
console.log("Data received");
data[1].role = data[0];
this.users.push(data[1]);
},
err => console.error(err)
);
我正在尝试使用forkJoin
订阅2个observable的结果。
由于某些原因,"收到的数据"消息未显示。
我的userMeta
变量在console.log上看起来很好:
出了什么问题?
更新:以下代码不返回任何内容
let source = Observable.forkJoin(
af.database.object('/roles/'+businessRole.$value),
af.database.object('/users/'+businessRole.$key)
);
let subscription = source.subscribe(
function (x) {
console.log("GOT: " + x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
我实际上要做的是提高以下代码的性能:
//Subscription 3: role ID to role Name
af.database.object('/roles/'+businessRole.$value)
.subscribe((roleData) => {
//Subscription 4: Get user info
af.database.object('/users/'+businessRole.$key).subscribe(user => {
答案 0 :(得分:16)
forkJoin()
要求所有源Observable至少发出一次并完成。
以下演示按预期完成:
const getColHeight = (tags) => {
if (notEmpty(tags)) InfiniteScrollFactory.attachScrollListener('socialMedia', socialCol, tags);
};
现场演示:https://stackblitz.com/edit/rxjs-urhkni
const source = forkJoin(
from([1,2,3]),
from([9,8,7,6])
).subscribe(
x => console.log('GOT:', x),
err => console.log('Error:', err),
() => console.log('Completed')
);
2019年1月:更新了RxJS 6
答案 1 :(得分:12)
我在使用Angular 2 / Angularfire 2时遇到了类似的问题,特别是我在查看用户是否通过电子邮件存在的问题。在一种情况下,用户存在,我从Observable接收了一个对象的数组。在另一种情况下,用户不存在,我收到一个空数组。
当我使用带有resultSelector和subscribe的forkJoin时,resultSelector和subscribe函数都没有运行。但是,当我尝试
时Observable.zip(
FirebaseListObservable,
FirebaseListObservable,
(...results) => {
return results.map(some code here)
}
).subscribe(res => console.log(res));
选择器和订阅都工作。我认为这与@ martin的答案有关,其中forkJoin需要observables来完成,因为根据定义它返回最后的排放。如果一个observable永远不会完成,我想它永远不会有 last 发射。
也许angularfire list observables(或你的情况下的object observable)永远不会完成,因此forkJoin的使用变得不可能。幸运的是,zip具有类似的行为并且仍然有效,不同之处在于,如果数据在Firebase中发生变化,它可以重复多次,而forkJoin只会结合最后一个响应。
在我的情况下,我正在寻找1)使用zip并接受我的代码可能会运行多次如果用户数据在.zip仍在运行时发生变化,2)在第一组数据后手动禁用zip返回,或者3)抛弃Angularfire并直接尝试Firebase api,使用像.once这样的东西来查看我是否可以获得一个完成并触发forkJoin的observable。
答案 2 :(得分:12)
我遇到了类似的问题:我正在动态创建一个observable列表,我注意到forkjoin()
如果observable列表为空则永远不会发出也不会完成,而Promise.all()
会解析为Observable.forkJoin([])
.subscribe(() => console.log('do something here')); // This is never called
空列表:
return jobList.length ? Observable.forkJoin(jobList) : Observable.of([]);
我找到的解决方法是检查列表的长度,并在它为空时不使用此运算符。
enhanced ecommerce
答案 3 :(得分:1)
我遇到了同样的问题,我无法真正使forkJoin
运算符起作用,所以我只使用了有效的combineLatest
!
答案 4 :(得分:0)
只需添加observer.complete();
将无法正常工作:
observer.next(...)
会工作:
observer.next(...);
observer.complete();
希望有帮助。