Javascript rxjs运算符,用于转换可观测值<;列表<;X>&燃气轮机;可观察<;X>;
我正在使用Angular HTTP和rxjs使用一个用户友好的API。我正试图从我的服务中获得一个可观察的Javascript rxjs运算符,用于转换可观测值<;列表<;X>&燃气轮机;可观察<;X>;,javascript,angular,rxjs,observable,reactive-programming,Javascript,Angular,Rxjs,Observable,Reactive Programming,我正在使用Angular HTTP和rxjs使用一个用户友好的API。我正试图从我的服务中获得一个可观察的返回。下面是从get请求返回的JSON示例: Items: { "$type": "System.Collections.Generic.List`1[[Asi.Soa.Core.DataContracts.GenericEntityData, Asi.Contracts]], mscorlib" "$values": [ Object { "$type
返回。下面是从get请求返回的JSON示例:
Items: {
"$type": "System.Collections.Generic.List`1[[Asi.Soa.Core.DataContracts.GenericEntityData, Asi.Contracts]], mscorlib"
"$values": [
Object { "$type": "Asi.Soa.Core.DataContracts.GenericEntityData, Asi.Contracts", EntityTypeName: "7", Properties: {…} }
Object { "$type": "Asi.Soa.Core.DataContracts.GenericEntityData, Asi.Contracts", EntityTypeName: "7", Properties: {…} }
Object { "$type": "Asi.Soa.Core.DataContracts.GenericEntityData, Asi.Contracts", EntityTypeName: "7", Properties: {…} }
]
}
然后在每个对象内部:
{
"$type": "Asi.Soa.Core.DataContracts.GenericEntityData, Asi.Contracts"
EntityTypeName: "7"
Properties: {
"$type": "Asi.Soa.Core.DataContracts.GenericPropertyDataCollection, Asi.Contracts"
"$values": {}
}
我需要为每个项目提取$values
,然后返回$values
对象的列表。但我不知道如何在没有订阅的情况下使用Angular和rxjs实现这一点。我不想订阅,因为我想让组件,而不是服务来处理结果数据
我一直在寻找rxjs操作符来解决我的问题。但是,似乎没有一个操作符可以将列表
转换为X,同时保留可观测值
这可能与Angular2+和rxjs有关吗?或者有没有更好的方法来完成这项任务。我对反应式编程相对较新,因此任何一般性建议都将不胜感激。您可以使用map()操作符转换RxJS中的元素。它将更改应用于流中的每个元素,并返回更改后的元素
subscribe()的目的是首先触发所有RXJS函数。因为即使一个冷的可观测对象获得了一个新的值,它也不会发生任何事情,除非最后是一个订阅。所以你可以
const sub = $stream.map(originalValue => {return transformToX(originalValue);})
.subscribe(transformedValue => {
emitter.emit(transformedValue);
});
或者更清楚地说明认购的目的:
const sub = $stream.map(originalValue => {return transformToX(originalValue);})
.do(transformedValue => {
emitter.emit(transformedValue);
})
.subscribe();
当你不再需要订阅时,不要忘记取消订阅!有关详细信息,请参见。使用map()-运算符转换RxJS中的元素。它将更改应用于流中的每个元素,并返回更改后的元素
subscribe()的目的是首先触发所有RXJS函数。因为即使一个冷的可观测对象获得了一个新的值,它也不会发生任何事情,除非最后是一个订阅。所以你可以
const sub = $stream.map(originalValue => {return transformToX(originalValue);})
.subscribe(transformedValue => {
emitter.emit(transformedValue);
});
或者更清楚地说明认购的目的:
const sub = $stream.map(originalValue => {return transformToX(originalValue);})
.do(transformedValue => {
emitter.emit(transformedValue);
})
.subscribe();
当你不再需要订阅时,不要忘记取消订阅!请参阅。使用(在其他实现中通常称为flatMap
)
mergeMap
允许您:
将每个项目映射到列表中(即,为每个事件发出一个值列表)
将列表展平返回到一个事件流中
假设收到以下数据:
const result = {
items: {
$type: 'something something',
$values: [1, 2, 3]
}
}
您可以使用以下方法获得其值的可观察的:
Rx.Observable.of(result).mergeMap(x => x.items.$values)
例如:
Rx.Observable
.of(result)
.mergeMap(x => x.items.$values)
.subscribe(value => console.log(`new value: ${value}`));
。。。将打印:
新值:1
新值:2
新值:3
使用(在其他实现中通常称为flatMap
)
mergeMap
允许您:
将每个项目映射到列表中(即,为每个事件发出一个值列表)
将列表展平返回到一个事件流中
假设收到以下数据:
const result = {
items: {
$type: 'something something',
$values: [1, 2, 3]
}
}
您可以使用以下方法获得其值的可观察的:
Rx.Observable.of(result).mergeMap(x => x.items.$values)
例如:
Rx.Observable
.of(result)
.mergeMap(x => x.items.$values)
.subscribe(value => console.log(`new value: ${value}`));
。。。将打印:
新值:1
新值:2
新值:3
原始可观察($stream)保持不变。您可以随时对其应用更改并订阅这些更改。因此,在类中的任何其他位置,都可以有另一个$stream.map(…).subscribe()代码>和原始可观察($stream)保持不变。您可以随时对其应用更改并订阅这些更改。因此,在类中的任何其他位置,都可以有另一个$stream.map(…).subscribe()代码>我最终需要将map和mergeMap结合起来,但这正是我想要的。谢谢我最终需要将map和mergeMap结合起来,但这正是我想要的。谢谢