Что является заменой для $ q.when, $ q.defer & defer.promise в Angular 6 с использованием Observable - PullRequest
0 голосов
/ 28 декабря 2018

Я обновляю Angularjs до Angular 6, в AngularJS они используют Promises и некоторые функции $ q, я не смог найти замену некоторым функциям.Я ищу замену $ q.when, $ q.defer, Defer.resolve () и Defer.promise.Как добиться этого с помощью Observable?

common.$q.when(checkDuplicate()).then(function (dupSc) {
 if(dupsc.length !== 0){
  some functions...
    }}

function checkDuplicate() {
        var defer = common.$q.defer();
        var url = "XYZ"
        dataService.getData(url).then(function (response) {
            defer.resolve(response.value);
        });
        return defer.promise;
    }

Теперь я хочу преобразовать все эти функции в Angular 6, используя Observable, может кто-нибудь предложить лучший способ заменить это в Angular 6 на примере.

1 Ответ

0 голосов
/ 20 февраля 2019

Насколько я знаю, нет сравнения один в один.$q по сути является реализацией Promise, и поскольку Angular переключился на использование RxJs, не было сопоставления один к одному.Однако все, что вы можете сделать с $q, возможно в RxJs несколько иным образом.

Поскольку от ваших требований к дизайну зависит то, как вы хотите реализовать свои наблюдаемые, я не смогупривести примеры всех случаев, но недавно мне пришлось преобразовать свой собственный проект Angular1 (используя $q.defer()) в Angular7 (теперь используя RxJs наблюдаемые), и вот один из примеров.

В angular1 поискФункциональность была такова: как пользовательские типы, вызывайте backend для получения данных поиска, но отменяйте этот запрос, как только пользователь вводит больше, и возвращают самые последние данные, например, как в Google.Для этого я использовал defer().

В angular2 та же функциональность может быть достигнута с помощью switchMap .switchMap отбросит все предыдущие сгенерированные события, результаты которых еще не доступны с новым событием, и будет ждать результатов нового события.Это то же самое, что преждевременное выполнение обещания defer().Ниже приведен код моей функции поиска angular2.

fromEvent(this.searchTextInput.nativeElement, 'keyup')
  .pipe(
    map((event: KeyboardEvent) => {
      return event.target
    }),
    debounceTime(1000),
    switchMap((searchInput: HTMLInputElement) => {
      this.searchInProgress = true
      this.searchText = searchInput.value

      if (this.searchText.length > 0) {
        return this.pluginService.searchPlugins(searchInput.value)
      } else {
        return EMPTY
      }
    })
  )
  .subscribe({
    next: (plugins: Plugin[]) => {
      this.searchInProgress = false
      this.searchResults = plugins
    },
    error: (error: HttpErrorResponse) => {
      this.searchInProgress = false
      this.errorChange.emit(error)
    }
  })
...