【问题标题】:Angular 4 - How to check if observable contains a stringAngular 4 - 如何检查 observable 是否包含字符串
【发布时间】:2018-11-12 23:54:07
【问题描述】:

我正在尝试确定 observable 是否包含字符串。这个问题是双重的。如何将结果映射回一个对象,然后在我拥有该对象后确定它是否包含特定的 orderId。

我用这个例子没有运气: How to check if a RxJS Observable contains a string in Angular2?

我有这项服务:

public getOrders(): Observable<OrderModel[]> {
    return this.http
    .get(this.apiURL)
    .map(response => response.json() as OrderModel[]);
}

我的组件有这个:

private verifyPaidOrder(): Observable<OrderModel[]> {

//this works fine and gives me back everything.  
// this.orderService.getOrders().subscribe(
//   (response => this.allOrders = response),
//   (err) => { this.handleError(err); });

// now, how do I determine if orderId exists?
//  Property 'orderId' does not exist on type 'OrderModel[]

this.orderService.getOrders().map(x => x.orderId)  <-- Can't do this!!
.first(roles => roles.indexOf(name) !== -1, undefined, false)
.map(val => !!val);

...

}

我的模型是:

export class OrderModel {

        constructor(
            public orderId: number,
            public firstName: string,
            public lastName: string,
            public emailAddress: string,
            public organizationName: string,
            public city: string,
            public state: string,
            public zipCode: number,
        ) { }

    }

【问题讨论】:

    标签: angular typescript


    【解决方案1】:

    在您的组件中:

    private verifyPaidOrder(): Observable<OrderModel[]> {
    
    this.orderService.getOrders().map(x => x.orderId)  <-- Can't do this!!
      .first(roles => roles.indexOf(name) !== -1, undefined, false)
      .map(val => !!val);
    }
    

    应改为:

    private verifyPaidOrder() {
      this.orderService.getOrders()
        .subscribe(
        (response) => {
          this.allOrders = response;
          //orderExists will be true if there are any with whateverOrderId you want to check for
          this.orderExists = response.some(x => x.orderId === whateverOrderId);
        });
    }
    

    当您真正想要调用您的服务时,您不再使用.map()。你订阅它。如果您想在订单返回到您调用服务的位置之前检查该订单是否存在于服务中,那么您可以将检查放入 map() 中,然后再将 observable 与您的数据一起返回。

    【讨论】:

    • 您基本上是在将 observable 的内容复制到另一个数组中。这效率不高:如果您的反应很大怎么办?您也没有使用 let,因此填充了全局范围。更好的方法是直接使用可观察对象并扫描您的状况。
    • @flashjpr 这个问题特别指出这个问题有两个方面。如何将结果映射回一个对象,然后在我拥有该对象后确定它是否包含特定的 orderId。没有处理 BIG 数据的规定。为什么我的回答要反映这一要求?这些问题并不复杂,我确切地回答了如何做到这一点。你说得对,不过我用orderExists 填充了全局范围。解决了这个问题。
    【解决方案2】:

    错误消息告诉您正在访问该数组并且该数组没有名为orderId 的属性。您需要在数组中找到顺序。

    我做了类似的事情,我的代码如下所示:

        return this.getProducts()
            .map((products: IProduct[]) => products.find(p => p.productId === id));
    

    它使用产品数组上的查找。

    你应该可以做类似的事情:

    this.orderService.getOrders().map(x => x.find(o => o.orderId == id));  
    

    【讨论】:

    • ...谢谢!
    猜你喜欢
    • 2017-03-06
    • 2017-09-23
    • 2016-03-25
    • 1970-01-01
    • 2020-12-12
    • 2017-02-27
    • 1970-01-01
    • 2011-03-31
    相关资源
    最近更新 更多