当前位置:  开发笔记 > 编程语言 > 正文

为什么要对Http服务使用.takeUntil()而不是.take(1)?

如何解决《为什么要对Http服务使用.takeUntil()而不是.take(1)?》经验,为你挑选了1个好方法。

背景:我正在执行@ NGRX /效应中的@ NGRX /存储项目和研究示例应用程序。

问题:在BookEffects类文件的第50行中,为什么takeUntil(...)使用代替take(1)?在这种情况下,两者似乎都可以完成相同的任务。

@Injectable()
export class BookEffects {
  constructor(private actions$: Actions, private googleBooks: GoogleBooksService) { }

  @Effect()
  search$: Observable = this.actions$
    .ofType(book.ActionTypes.SEARCH)
    .debounceTime(300)
    .map((action: book.SearchAction) => action.payload)
    .switchMap(query => {
      if (query === '') {
        return empty();
      }

      const nextSearch$ = this.actions$.ofType(book.ActionTypes.SEARCH).skip(1);

      return this.googleBooks.searchBooks(query)
        .takeUntil(nextSearch$)
        .map(books => new book.SearchCompleteAction(books))
        .catch(() => of(new book.SearchCompleteAction([])));
    });
}

这是Google图书服务文件:

@Injectable()
export class GoogleBooksService {
  private API_PATH: string = 'https://www.googleapis.com/books/v1/volumes';

  constructor(private http: Http) {}

  searchBooks(queryTitle: string): Observable {
    return this.http.get(`${this.API_PATH}?q=${queryTitle}`)
      .map(res => res.json().items || []);
  }

  retrieveBook(volumeId: string): Observable {
    return this.http.get(`${this.API_PATH}/${volumeId}`)
      .map(res => res.json());
  }
}

cartant.. 5

要了解为什么takeUntil要使用它,可能不做关于的实现的任何假设searchBooks

searchBooks服务方法返回一个可观察的Book[]。该可观察性不一定必须完成;例如,如果数据库发生更改,它可能会发出其他结果(Firebase的AngularFire2可观察对象就是这种情况)。但是,如果take(1)使用,后续结果将被忽略。如果takeUntil使用,则后续结果将继续起作用,直到启动下一个搜索为止。

但是,我认为并不是takeUntil必不可少的,因为switchMap遗嘱会处理事情(内部可观察的对象将不被订阅,等等)。

的作者(S)example-app出现在这样的方式已经实现了搜索的效果,这是不依赖于服务的实现。

使用的简单的,Http基于的实现searchBooks,我看不到为什么需要一个take(1)或为什么要这样做takeUntil-因为可观察的对象将完成,并且switchMap将确保SearchCompleteAction不会发出过时的搜索动作。



1> cartant..:

要了解为什么takeUntil要使用它,可能不做关于的实现的任何假设searchBooks

searchBooks服务方法返回一个可观察的Book[]。该可观察性不一定必须完成;例如,如果数据库发生更改,它可能会发出其他结果(Firebase的AngularFire2可观察对象就是这种情况)。但是,如果take(1)使用,后续结果将被忽略。如果takeUntil使用,则后续结果将继续起作用,直到启动下一个搜索为止。

但是,我认为并不是takeUntil必不可少的,因为switchMap遗嘱会处理事情(内部可观察的对象将不被订阅,等等)。

的作者(S)example-app出现在这样的方式已经实现了搜索的效果,这是不依赖于服务的实现。

使用的简单的,Http基于的实现searchBooks,我看不到为什么需要一个take(1)或为什么要这样做takeUntil-因为可观察的对象将完成,并且switchMap将确保SearchCompleteAction不会发出过时的搜索动作。

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有