Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度/RxJs不识别阵列_Javascript_Angular_Asp.net Core Mvc_Rxjs - Fatal编程技术网

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})))
}