从2个可观测对象中获取一次数据
Get data once from 2 observables
我有2个可观察对象,我需要得到每个可观察数据只有一次。
我所做的是订阅中的订阅,尽管它们可以在同一时间(并行)执行。
let table = this.af.database.object('tables');
table.subscribe((tableData) => {
let section_seats = this.af.database.object('sections').take(1)
.subscribe((sectionData) => {
//Here I'm Using tableData & sectionData
});
});
上面的代码工作得很好,但是它们不能同时执行,尽管它们可以。
我如何同时执行两个可观察对象,然后使用从它们两个接收到的数据?
更新:使用forkJoin()不做任何事情(以下代码中没有控制台日志)
var source = Observable.forkJoin(
this.af.database.object('tables'),
this.af.database.object('sections')
);
var subscription = source.subscribe(
function (x) {
console.log('Next: %s', x);
},
function (err) {
console.log('Error: %s', err);
},
function () {
console.log('Completed');
});
有许多方法(读取、操作符)可以帮助您组合资源。一般资源可以在这里找到,在Combining multiple observable sequences into a single sequence
部分。对于你的具体问题,这里有一个简短的列表,似乎可以削减:
- combinellatest:当1时发出一个值。两个源都发出了至少一个值2。在此之后,任何时候其中一个源发出一个值。
例如:Rx.Observable.combineLatest(object('tables'), object('sections').take(1))
- withLatestFrom:当第一个源发出一个值时发出一个值。发出的值包括第二个源最近发出的值。
例如:object('tables').withLatesFrom(object('sections').take(1))
- zip:在两个源都发出一个值时发出第一个值。通过同一进程发出第n个值。
示例:Rx.Observable.zip(object('tables'), object('sections').take(1))
每一个操作符都有相似但略有不同的语义。我认为combineLatest
是你需要的,但检查文档,设置一些代码并尝试一些东西,如果这不起作用,回来并发布在这里。
您应该使用withLatestFrom
操作符。
查看更多关于withLatestFrom
/* Have staggering intervals */
var source1 = Rx.Observable.interval(140)
.map(function (i) { return 'First: ' + i; });
var source2 = Rx.Observable.interval(50)
.map(function (i) { return 'Second: ' + i; });
// When source1 emits a value, combine it with the latest emission from source2.
var source = source1.withLatestFrom(
source2,
function (s1, s2) { return s1 + ', ' + s2; }
).take(4);
var subscription = source.subscribe(
function (x) {
console.log('Next: ' + x.toString());
},
function (err) {
console.log('Error: ' + err);
},
function () {
console.log('Completed');
});
// => Next: First: 0, Second: 1
// => Next: First: 1, Second: 4
// => Next: First: 2, Second: 7
// => Next: First: 3, Second: 10
// => Completed
forJoin
的文档对此进行了解释:
并行运行所有可观察序列并收集它们的最后一个元素。
最后一个元素我假设将是在可观察对象完成之前触发的最后一个元素,所以你传递给forkJoin
的所有可观察对象必须在发出任何内容之前完成。
因为你只想要第一个发出的元素,所以尝试让每个Observable在它的第一个发出之后完成:
var source = Observable.forkJoin(
this.af.database.object('tables').take(1),
this.af.database.object('sections').take(1)
);
try this:
var source = Observable.forkJoin(
this.af.database.object('tables'),
this.af.database.object('sections')
);
var subscription = source.subscribe(
data => {
console.log(data[0]);
console.log(data[1]);
},
err => console.error(err)
);
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 数据互绑定问题:转换器只运行一次,无法绑定元素的 ID
- Jquery 循环一次或在数据数组中显示一次数据
- 如果发现任何数据,如何停止每7秒运行一次的函数
- Ajax 使用函数每秒获取一次 php 数据
- jqueryhttp将数据发布到整个数组,一次发送一个
- 将数据加载到本地存储一次
- 在用户为下一次输入插入数据后清空文本字段
- 如何在用户滚动到页面底部时仅加载一次数据
- 一次打开一行详细信息数据表
- 如何使用上一次调用的数据进行第二次 JS .post 调用
- Socket.io - 每 34 毫秒接收一次数据
- Canvas getImageData() 为了获得最佳性能.提取所有数据或一次提取一个数据
- 如何使用jquery只追加一次数据
- 在Angular 2中,使用observable获取一次数据
- 从2个可观测对象中获取一次数据
- 在Firebase中只检索一次数据
- 每分钟更换一次数据集
- 通过socket.io每隔10秒发送一次数据
- 如何使用jQuery单击后仅附加一次数据