angular6 - 如何通过简单的 http 调用使用 @ngrx/effects?

标签 angular6 ngrx ngrx-effects

我有一个非常简单的 http 服务:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { environment } from '../../environments/environment';

import { JsOrder } from '../stores/models/order';

@Injectable({
    providedIn: 'root'
})
export class OrderService {
    private ordersUrl = `${environment.httpApiUrl}/orders`;

    constructor(private http: HttpClient) {}

    fetchOrders(): Observable<JsOrder[]> {
        return this.http.get<JsOrder[]>(this.ordersUrl);
    }
}

我试图从@ngrx/effects 调用它(基于网络上的几个示例):
import { Injectable } from '@angular/core';
import { Actions, Effect, ofType } from '@ngrx/effects';
import { Action } from '@ngrx/store';
import { Observable } from 'rxjs';
import { switchMap } from 'rxjs/operators';

import { FETCH_ORDERS, LoadOrders } from '../actions';
import { JsOrder, Order } from '../models/order';
import { OrderService } from '../../services/order.service';

@Injectable()
export class OrderEffects {
    constructor(
        private actions$: Actions,
        private orderService: OrderService
    ) {}

    @Effect()
    fetchOrders$: Observable<Action> = this.actions$.pipe(
        ofType(FETCH_ORDERS),
        switchMap(() => {
            return this.orderService
                .fetchOrders()
                .map((jsOrders: JsOrder[]) => {  <---- compilation error here
                    const orders = jsOrders.map(jsOrder =>
                        Order.create(jsOrder)
                    );
                    return new LoadOrders(orders);
                });
        })
    );
}

但是我在 .map() 上遇到编译错误上面调用:

error TS2339: Property 'map' does not exist on type 'Observable'



这样做的正确方法是什么?

附注我也试过subscribe()到 http 服务返回的 Observable(见下文),但这也会产生编译错误(“订阅”类型上不存在属性“ map ”):
@Effect()
fetchOrders$: Observable<Action> = this.actions$.pipe(
    ofType(FETCH_ORDERS),
    switchMap(() => {
        return this.orderService
            .fetchOrders()
            .subscribe((jsOrders: JsOrder[]) => {
                return jsOrders.map(jsOrder => Order.create(jsOrder));
            })
            .map((orders: Order[]) => new LoadOrders(orders));
    })
);

最佳答案

您必须使用 pipe和可管道操作符:

@Effect()
fetchOrders$: Observable<Action> = this.actions$.pipe(
    ofType(FETCH_ORDERS),
    switchMap(() => {
        return this.orderService
            .fetchOrders()
            .pipe(
                map((jsOrders: JsOrder[]) => {  
                  const orders = jsOrders.map(jsOrder =>
                      Order.create(jsOrder)
                  );
                  return new LoadOrders(orders);
                }),
               catchError(err => of(new LoadOrdersFailure(err)))
            )
    })
);

也不要忘记捕捉错误。

关于angular6 - 如何通过简单的 http 调用使用 @ngrx/effects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52212159/

相关文章:

javascript - NgRX 实体 : ids are undefined in the State

angular - Ngrx @Effects - 立即停止

html - 组件angular 6模板的继承

javascript - 无法在 Angular 6 中添加 Bootstrap 4

typescript - NgRx:如何声明由 Action 创建者创建的 Action 的显式类型?

angular - NgrX 效果重定向 Angular

rxjs - 需要帮助理解这个 Ngrx 效果

angular - ngrx 效果给出类型 'void' 不可分配给类型 'ObservableInput'

angular - 如何在 Angular 6 中包含外部 html 文件和 js 文件?

css - 在 Angular 中为 Less 使用全局变量