使用Observable在Angular 6中替换$ q.when,$ q.defer和defer.promise的方式是什么

时间:2018-12-28 06:06:37

标签: angular rxjs observable angular-promise

我正在从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;
    }

现在,我想使用Observable将所有这些功能转换为Angular 6,有人可以用示例来建议在Angular 6中替换此功能的最佳方法。

1 个答案:

答案 0 :(得分:1)

据我所知,没有一对一的比较。 $q本质上是Promise的实现,并且由于Angular切换为使用RxJs,因此没有一对一的映射。但是,在$q中可以用稍微不同的方式来处理RxJs

由于这取决于您的设计要求,因此您将如何实现可观察对象,因此我无法提供所有情况的示例,但是最近我不得不将自己的Angular1项目(使用$q.defer())转换为Angular7(现在使用RxJs可观察对象),这是一个示例。

在angular1中,搜索功能是:作为用户类型,请致电后端以获取搜索数据,但是一旦用户键入更多内容,便会取消该请求,并返回最新数据,例如在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)
    }
  })