javascript - 如何创建嵌套的商店管道?

标签 javascript angular rxjs

我正在尝试实现一个用例,其中我有两个商店,我必须从中按顺序获取值。目标是最终使用从商店中提取的这两个值调用 http 服务。

我尝试创建两个单独的可观察对象以分别取回值,然后将它们传递给 httpClient - 但我很好奇我是否应该这样做,或者我是否应该像嵌套管道选择一样尝试以下操作?

function userservice() {
    this.store.pipe(
    select(fromRoot.getCategories),
    take(1),
    switchMap(category => {
        this.otherstore.pipe(
        select(fromRoot.getUsers),
        take(1),
        switchMap(user => {
           return httpClient.get( apistuff with params user and category)
        })
    })
}

我想知道这是否是正确的方法,或者我是否应该查找两个变量 usercategory 作为 distincy selects() 然后调用 httpclient?

最佳答案

从技术上讲,您的代码很好,但最好避免嵌套,因为它会导致 promise 出现的情况 - 回调 hell 。如果您避免嵌套,那么它会使您的代码更容易阅读/理解。

如果您的内部 observable 依赖于外部 observable,则需要进行嵌套,否则您可以简单地组合这些 observable 以在您的 observable 管道中发出组合值。

在你的例子中 -

如果您的类别和用户是独立的,那么您应该执行以下操作以避免嵌套 -

 function userservice() {

  return combineLatest( //or you can use zip operator as per your requirement
    this.store.pipe(
      select(fromRoot.getCategories),
      take(1)),
    this.otherstore.pipe(
        select(fromRoot.getUsers),
        take(1))
  ).pipe(
    switchMap(([categories, users]) => {
        return httpClient.get( apistuff with params user and category);
    })
  );

如果用户依赖类别那么你可以做下面的[这个例子只是为了展示需要的嵌套;与你的场景无关] -

function userservice() {

  return this.store.pipe(
    select(fromRoot.getCategories),
    take(1),
    switchMap(categories => {
      return this.httpClient.get(/*get users for categories*/)
                 .pipe(
                   switchMap(users => this.httpClient.get( //apistuff with params user and category))
                 );
    })
  )  
}

你可以通过如下所示更改代码来避免嵌套在上面的代码中 -

function userservice() {

  return this.store.pipe(
    select(fromRoot.getCategories),
    take(1),
    switchMap(categories => {
      return zip(this.httpClient.get(/*get users for categories*/), of(categories)); //you can use combineLatest as well as per your need
    }),
    switchMap(([users, categories]) => {
      return httpClient.get( apistuff with params user and category);
    })
  )  
}

关于javascript - 如何创建嵌套的商店管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56535752/

相关文章:

javascript - 使用 (JavaScript) 从文件中获取 JSON 数据

angular - Stackblitz : how can i execute a test using Angular?

angular - 如何捕获 angular(ionic) 中的 http 错误?

javascript - 在for循环Angular2 Django中获取多个可观察请求

javascript - 如果标签已经存在,如何防止插入标签?

javascript - 如何使用键盘向左/右/上/下移动球?

Angular 5 react 形式 - 禁用单选组中的一个单选选项

node.js - 如何将 Observables 数组与 RxJS 6.x 和 Node.js 合并?

javascript - 以任意时间间隔循环字符串数组 (JS)

Angular 2 : Support for withCredentials and useXDomain