Насколько я знаю, нет сравнения один в один.$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)
}
})