2016-11-01 3 views
2

У меня есть 2 наблюдаемых, и мне нужно получить каждую наблюдаемую информацию только один раз.Получить данные один раз из 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 
}); 
}); 

Код выше отлично работает, но они не выполняются в одно и то же время, хотя они могут.

Как я могу выполнить оба наблюдаемых в одно и то же время, а затем использовать данные, полученные от них обоих?

Update: Использование 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'); 
    }); 
+0

Вы сделали какие-либо исследования по этому вопросу? Как насчет https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md – jonrsharpe

+0

Когда я использую forkJoin, ничего не выполняется, я не знаю, почему .. – TheUnreal

+0

'forkJoin' - это то, что вы хотите, пожалуйста, предоставьте код. Вы подписались? –

ответ

1

Есть несколько способов (читай, операторы), которые помогут вам объединить источники. Общий ресурс можно найти here, в разделе Combining multiple observable sequences into a single sequence. Для вашей конкретной проблемы, вот короткий список, который, кажется, сделать разрез:

  • combineLatest: выдает значение, когда 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 - это то, что вам нужно, но проверьте документ, настройте код и попробуйте что-нибудь, и если это не сработает, вернитесь и разместите его здесь.

0

Вы должны использовать 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 
0

Документация forJoin объясняет:

прогонов все наблюдаемые последовательностей параллельно и собирать их последние элементы.

последнего элемент я полагаю, буду последний элемент вызывается перед наблюдаемым Завершает, поэтому все Наблюдаемое что вы передаете в forkJoin должно быть завершено, прежде чем что излучается.

Поскольку вы хотите только первый элемент, испускаемый попытаться сделать каждый Наблюдаемые полный после его первого выделяют:

var source = Observable.forkJoin(
    this.af.database.object('tables').take(1), 
    this.af.database.object('sections').take(1) 
); 
0

попробовать это:

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) 
); 
Смежные вопросы