Observable vs Promise, как ждать завершения всех наблюдаемых? - PullRequest
0 голосов
/ 09 февраля 2020

В Node.js Мне нужно подождать несколько Observable с до конца sh. Мне также нужно подписаться на каждое наблюдаемое.

Я бы использовал Promise.all(), но это Observable s, а не Promise.

Правильно ли следующий код?

let promise1 = observable1.toPromise()
observable1.subscribe(...)
let promise2 = observable2.toPromise()
observable2.subscribe(...)
Promise.all([promise1, promise2]).then(...)

Если это не правильно, как это изменить?

Я попробовал этот код:

      let courtsPromise =
        this.ownedContractHandle.pastEvents({fromBlock: 0, filter: {courtId: this.courtIDs}})
          .subscribe(events => this.processCourtEvents(events))
      let namesPromise =
        this.courtNamesContractHandle.pastEvents({fromBlock: 0, filter: {ourCourtId: this.props.courtId}})
          .subscribe(events => this.processNameEvents(events))
      let trustedCourtsPromise =
        this.ownedContractHandle.getTrustedCourtsList(this.props.courtId)
      console.log('before zip')
      zip([courtsPromise, namesPromise]).subscribe(function(values) {
        console.log('values', values)
        this.updateCourtItems()
        this.updateTokenNames()
        this.updateTrustedCourts(values[2])
      })

Он печатает 'before zip', но не 'values'. Почему это не работает?

Кроме того, вы видите, среди двух наблюдаемых у меня также есть обещание. Как его тоже ждать (когда две наблюдаемые и одно обещание завершены)?

Ответы [ 3 ]

5 голосов
/ 09 февраля 2020

ты имеешь в виду что-то вроде почтового индекса?

Ссылка: https://www.learnrxjs.io/learn-rxjs/operators/combination/zip

Скопировал пример из приведенной выше ссылки в стек стлиц. Надеюсь, это поможет

https://stackblitz.com/edit/rxjs-cb55fc?devtoolsheight=60

3 голосов
/ 09 февраля 2020

Я думаю, что forkJoin - это оператор, которого вы ищете. Это оператор, который будет вести себя ближе всего к Promise.all (). Он ждет, пока все наблюдаемые не будут достигнуты, до sh, а затем выдаст все значения за один раз. Используйте это как:

forkJoin(observable1, observable2, observable3) .subscribe(([value1, value2, value3]) => { // Do what you want with the values })

Имейте в виду, что forkJoin не будет излучать ничего, пока все наблюдаемые не закончатся. Если вы хотите получить все значения, которые выдаются наблюдаемыми, а не только последние, вы можете использовать брата forkJoin с именем combLatest, например:

combineLatest(observable1, observable2, observable3)

To Ответив на дополнительный вопрос о добавлении обещания в поток, вы можете сделать это с помощью оператора from, например:

forkJoin(observable1, observable, from(myPromise) )

1 голос
/ 13 марта 2020

Это действительно должен быть комментарий, а не ответ (и с опозданием на месяц, действительно адресованный другим читателям), но когда он сталкивается с этим вопросом, проблема может заключаться не в том, что вам нужно ждать завершения всего наблюдаемого, но что ваши наблюдаемые на самом деле должны быть обещаниями.

Согласно https://rxjs.dev/guide/observable Наблюдаемые и обещания предназначены для двух разных вариантов использования. Если вы говорите: «Я знаю, как сделать это с обещаниями», то ответ, вероятно, обещания - правильное решение.

Я не могу сказать точно, но на основании имен (pastEvents, и getTrustedCourtList, очень похожи на основные функции типа «getter» ваших функций и то, как вы их используете, похоже, что вы используете Observables для координации асинхронной c работы. Это то, для чего нужны обещания.

Если вам просто нужно выполнить Шаг A, B & C, и когда они завершатся, используйте результаты для шага D, это обещания, а не Observables.

Если вы заботитесь только о том, что происходит при завершении, скорее всего, вы действительно хотите обещание.

Тем не менее, мое мнение таково, что наблюдаемые являются "заразными", то есть, как только вы их получили, вы должны продолжайте использовать их. Использование «toPromise» всегда немного рискованно, поскольку оно делает предположения о том, каким будет наблюдаемое, которое не обязательно допустимо, поэтому, если вы не можете изменить что-либо, если лежащие в основе объекты обещания, вам, вероятно, следует придерживаться наблюдаемых.

...