代码之家  ›  专栏  ›  技术社区  ›  Javier Torron Diaz

角度RxJS-使用另一个流中的值创建流(&R)

  •  -1
  • Javier Torron Diaz  · 技术社区  · 7 年前

    我对反应式编程和合并流有点迷茫。让我们假设一些流合并到最后一个流中:

     private pageByScroll$ = Observable.fromEvent(window, 'scroll')
        .map(() => window.scrollY)
        .filter(current => current >=  document.body.clientHeight - window.innerHeight)
        // Solo cuando el usuario para de hacer scroll por 200 ms
        .debounceTime(200)
        .distinct()
        .map(y => Math.ceil((y + window.innerHeight) / (this.itemHeight * this.ServicioDatos.elementosPorPagina)));
    
    private pageByResize$ =  Observable.fromEvent(window, 'resize')
        .debounceTime(200)
        .map(_ => Math.ceil(
            (window.innerHeight + document.body.scrollTop) / (this.itemHeight * this.ServicioDatos.elementosPorPagina)
        ));
    
    private pageByManual$ = new BehaviorSubject(1);
    
    private pageToLoad$ = Observable.merge(this.pageByManual$, this.pageByScroll$, this.pageByResize$)
        .distinct();
    

    我从一个 example 我试图完全理解它,修改并添加更多代码。

    现在我可以订阅了 pageToLoad$ 为了获得合并流生成的页码,它运行得很好,并在生成时为我提供所需的值。但我有另一个方法,它从HttpClient返回一个Observable,HttpClient调用我的API服务器并从数据库中获取结果。我一直在尝试使用 页面加载$ 用于发送到服务器(没有任何功能)。

    这是我的api调用方法:

    public loadPageOfEmpresas(pageNumber: number): Observable<any> {
        this.loadingMore = true;
        return this.apiService.getEmpresas(
            this.elementosPorPagina + '.' + pageNumber, this.app, 'es', this.latitude, this.longitude, null
        ).map(
            empresa => {
                return this.valueToEmpresa(empresa);
            },
            error => {
                throw new DOMException();
        });
    }
    

    我想我需要以某种方式合并两个可观察对象,但无法获得如何使用第一个值将第一个值与第二个值合并的信息。你能告诉我该走哪条路吗?为什么?

    非常感谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Picci    7 年前

    我猜您希望在页码更改的任何时候调用http服务,即任何时候 pageToLoad$ 发射。

    如果是这种情况,那么您可以尝试以下操作

    pageToLoad$
    .switchMap(pageNumber => loadPageOfEmpresas(pageNumber))
    

    switchMap是一个RxJs操作符,它基本上可以执行以下操作:在本例中,任何时候源可观察到的发射 页面加载$ ,将控件传递给它作为参数接收的可观察对象,在这种情况下,由 loadPageOfEmpresas ,并完成之前创建的任何可观察项。

    因此,如果您订阅了switchMap返回的observable,那么您应该拥有您想要的东西。

    你可以 read here 了解更多详细信息。

    顺便说一下,我看到您正在向 map 运算符,最后一个是处理错误条件的函数。我认为这是不可能的。这个 地图 运算符不接受第二个参数作为处理错误的函数。