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

2024-01-10

Context:我正在努力实施@ngrx/效果 https://github.com/ngrx/effects在一个@ngrx/商店 https://github.com/ngrx/store项目并研究示例应用程序 https://github.com/ngrx/example-app.

问题: In the BookEffects 类文件 https://github.com/ngrx/example-app/blob/master/src/app/effects/book.ts#L50,第 50 行,为什么takeUntil(...)使用而不是take(1)?在这种情况下,两者似乎都完成了同样的事情。

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

  @Effect()
  search$: Observable<Action> = 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 图书服务文件 https://github.com/ngrx/example-app/blob/master/src/app/services/google-books.ts#L8-L23:

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

  constructor(private http: Http) {}

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

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

了解原因takeUntil使用时,可能有助于不对实施进行任何假设searchBooks.

The searchBooks服务方法返回一个可观察的Book[]。该可观察对象不一定必须完成;例如,如果数据库发生变化,它可能会发出额外的结果(这就是 Firebase 的 AngularFire2 observables 发生的情况)。然而,如果take(1)使用后,后续结果将被忽略。如果takeUntil使用后,后续结果将继续影响操作,直到启动下一次搜索。

然而,我不认为takeUntil是至关重要的,因为switchMap会处理事情(内部可观察的将被取消订阅,等等)。

该书的作者example-app似乎已经以不依赖于服务的实现的方式实现了搜索效果。

用简单的,Http基于的实施searchBooks,我也不明白为什么take(1) or takeUntil将需要 - 因为可观察的将完成并且switchMap将确保SearchCompleteAction不会发出过时搜索的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Http 服务中使用 .takeUntil() 而不是 .take(1)? 的相关文章

随机推荐