Javascript 角度/RxJs不识别阵列
我不明白为什么下面的代码不能按预期工作Javascript 角度/RxJs不识别阵列,javascript,angular,asp.net-core-mvc,rxjs,Javascript,Angular,Asp.net Core Mvc,Rxjs,我不明白为什么下面的代码不能按预期工作 public GetX(): Observable<MyDataType> { return this.http.get('http://localhost:64113/api/endpoint') .map((r: Response) => r.json()) .map((r) => r.someProperty) .catch(error => Observa
public GetX(): Observable<MyDataType> {
return this.http.get('http://localhost:64113/api/endpoint')
.map((r: Response) => r.json())
.map((r) => r.someProperty)
.catch(error => Observable.throw(error));
}
映射不应该迭代从服务器传回的数组中的每个元素吗
下面是console.log的结果
(124) [Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object…]
问题是您正在调用的第二个map函数。映射将转换应用于数据流,并应返回转换后的元素 目前,第二个映射使用webapi返回的POJO数组,但不会再次将它们传递回流 假设
MyDataType
是一个typescript接口,并且包含从webapi返回的JSON对象的匹配属性,您可以使用以下内容打印服务器响应:
return this.http.get('http://localhost:64113/api/endpoint')
.map(r => r.json())
.do(r => console.log(r))
.catch(error => Observable.throw(error));
更新:如果要映射数组中每个元素的属性,应使用mergeMap
return this.http.get('http://localhost:64113/api/endpoint')
.map(r => r.json()) // map to json body
.mergeMap(r => r) // flatten array
.map(e => e.property) //map singular objects to a property
.catch(error => Observable.throw(error));
MergeMap
将通过将每个单一POJO映射到其一个属性来展平数组。在这种情况下,函数的返回类型实际上不再准确
您可以找到有关运算符的更多信息如果需要迭代ajax调用返回的数组,应该将其包装在Observable.from函数中。在json映射之后,您确实需要另一个映射,该映射不返回值,而是一个可观察的映射。在这种情况下,请使用平面图
//code omitted for brevity
.map( r : Response => r.json() )
.flatMap((obj: any) => Observable.from(obj) )
在这一点之后,数组的可观测值变成了单个值的可观测值。但是,我对您提供的类型没有任何线索,也看不出该类型是否是数组的包装器
我想从数组的每个元素中获取一个属性,并返回这些属性的数组。e、 g[{property:1},{property:2},{},{}…]
然后,我建议您按照如下方式进行操作,在数组中使用map,并使用object.assign
public GetX(): Observable<MyDataType> {
return this.http.get('http://localhost:64113/api/endpoint')
.map((r: Response) => r.json().map((x:any) => Object.assign({propertyName: x.property})))
}
public GetX():可观察{
返回此.http.get('http://localhost:64113/api/endpoint')
.map((r:Response)=>r.json().map((x:any)=>Object.assign({propertyName:x.property})))
}
将MyDataType的代码放入我做了一个更接近我实际操作的更改。做了更多测试后,问题在于第二个map函数没有将参数(r)视为数组元素,在调用第二个map函数时,r仍然是一个数组。您返回的JSON对象是一个对象数组还是一个对象?如果是数组,您认为如何将每个元素的单个属性仅映射到一个对象?在这种情况下,函数的返回类型应该是一个数组,从服务器返回一个对象数组,我不想映射到单个元素。我想从数组的每个元素中获取一个属性,并返回这些属性的数组。e、 g[{property:1},{property:2},{},{}…]操作代码是正确的,因为没有使用{}标识回调代码,值会自动返回。不确定您的意思,但是是的,这与箭头表达式有关。无论如何,op编辑了包含控制台日志的原始问题…我会更新我的回答。我得到:您在预期流的位置提供了“未定义”。你可以提供一个可观察的、承诺的、数组的或可观察的。但是为什么网上的例子都不这样做呢?这是一个非常基本的例子,比你想象的更常见,但是由于不知道可观察的客户,我不能说这是正确的方法。例如,observable的客户机(其订户)只需要一个值数组来呈现它们,或者模板是使用者,并且它正在使用异步管道。所有这些都基于客户机感兴趣的值的类型,并且可以使用许多运算符来映射特定需求的可观察输出。我为什么需要执行可观察。从(obj)?调用http.get函数得到的值是响应的可观察值,响应是单个值。如果需要多次发射的流,可以创建自定义流或使用Observable.from操作符
public GetX(): Observable<MyDataType> {
return this.http.get('http://localhost:64113/api/endpoint')
.map((r: Response) => r.json().map((x:any) => Object.assign({propertyName: x.property})))
}