Angular 如何转换可观测值<;产品[]>;可观察<;产品>;[]没有订阅?

Angular 如何转换可观测值<;产品[]>;可观察<;产品>;[]没有订阅?,angular,rxjs,observable,rxjs-observables,rxjs-pipeable-operators,Angular,Rxjs,Observable,Rxjs Observables,Rxjs Pipeable Operators,在我当前的angular项目中,我有一个返回可观察的服务。 我想将该流转换为单个产品的可观测数组。我希望使用管道操作符实现这一点,而不订阅原始流 从实体的可观察对象到实体的可观察对象数组当您在可观察对象上使用管道时,您将始终返回一个新的可观察对象,而不是数组。您可以访问产品[],并将其映射到一个(可观察)[,而不会出现任何问题,但结果仍将包装在另一个可观察对象中: 从'rxjs'导入{of}; 从“rxjs/operators”导入{map}; 接口产品{ id:编号; } 常数乘积:可观测=o

在我当前的angular项目中,我有一个返回可观察的服务。 我想将该流转换为单个产品的可观测数组。我希望使用管道操作符实现这一点,而不订阅原始流


从实体的可观察对象到实体的可观察对象数组

当您在可观察对象上使用
管道
时,您将始终返回一个新的可观察对象,而不是数组。您可以访问
产品[]
,并将其映射到一个
(可观察)[
,而不会出现任何问题,但结果仍将包装在另一个可观察对象中:

从'rxjs'导入{of};
从“rxjs/operators”导入{map};
接口产品{
id:编号;
}
常数乘积:可观测=of([
{id:1},
{id:2},
{id:3},
]);
产品
.pipe(map(ps=>ps.map((p)=>of(p)))
.subscribe((可观测项:可观测[])=>{
//在这里,您可以访问观测值数组:
控制台日志(可观察);
})
您也可以在
pipe
中访问
map()
的结果,而不是订阅可观察内容,但结果仍然只能从可观察内容中访问:

/。。。
从“rxjs/operators”导入{map,tap};
// ...
常数x=乘积
.烟斗(
map(ps=>ps.map((p)=>of(p)),
轻触((可观察:可观察[])=>{
//在这里,您还可以访问观测值数组:
控制台日志(可观察);
}),
);
但是
x
仍然是一个可观察的:

常数x:可观测
或者同等地,但可能更容易理解:

常数x:可观测

当你在一个可观测对象上使用管道时,你总是会得到一个新的可观测对象,而不是一个数组。您可以访问
产品[]
,并将其映射到一个
(可观察)[
,而不会出现任何问题,但结果仍将包装在另一个可观察对象中:

从'rxjs'导入{of};
从“rxjs/operators”导入{map};
接口产品{
id:编号;
}
常数乘积:可观测=of([
{id:1},
{id:2},
{id:3},
]);
产品
.pipe(map(ps=>ps.map((p)=>of(p)))
.subscribe((可观测项:可观测[])=>{
//在这里,您可以访问观测值数组:
控制台日志(可观察);
})
您也可以在
pipe
中访问
map()
的结果,而不是订阅可观察内容,但结果仍然只能从可观察内容中访问:

/。。。
从“rxjs/operators”导入{map,tap};
// ...
常数x=乘积
.烟斗(
map(ps=>ps.map((p)=>of(p)),
轻触((可观察:可观察[])=>{
//在这里,您还可以访问观测值数组:
控制台日志(可观察);
}),
);
但是
x
仍然是一个可观察的:

常数x:可观测
或者同等地,但可能更容易理解:

常数x:可观测

我认为管道操作符不可能做到这一点,因为管道方法只接受生成一个可观察对象的操作符。也许你可以通过创建一系列行为主题并将结果推送到那里来实现。谢谢@ShamPooSham。我会试试的。老实说,我不知道你想用这个做什么。从您的另一条评论来看,您似乎希望使用
*ngFor
async
循环浏览模板中的结果。这不是不可能通过
可观察的
实现的。也许你的问题应该是关于这个问题,我觉得我的解决方案很难看,并且使代码更难推理。如果我在简单的div上循环,那么这就不需要了。实际上,我与*ngFor循环的组件期望单个实体的可观察性。我认为管道操作符不可能做到这一点,因为管道方法只接受生成一个可观察对象的操作符。也许你可以通过创建一系列行为主题并将结果推送到那里来实现。谢谢@ShamPooSham。我会试试的。老实说,我不知道你想用这个做什么。从您的另一条评论来看,您似乎希望使用
*ngFor
async
循环浏览模板中的结果。这不是不可能通过
可观察的
实现的。也许你的问题应该是关于这个问题,我觉得我的解决方案很难看,并且使代码更难推理。如果我在简单的div上循环,那么这就不需要了。实际上,我与*ngFor循环的组件期望单个实体的可观察性。可以帮助理解的一件事是,在可观察的上下文中,不知道事件数组有多少个条目。数组不受限制,因此不能动态拆分为多个变量。Pairwise正在做他想做的事情,但是操作符只分成两个独立的部分。谢谢Jeffrey,这很有意义。但是不可能使用异步管道在模板中循环一个可观察的可观察对象。有一点可以帮助理解,在可观察对象的上下文中,不知道事件数组有多少个条目。数组不受限制,因此不能动态拆分为多个变量。Pairwise正在做他想做的事情,但是操作符只分成两个独立的部分。谢谢Jeffrey,这很有意义。但不可能使用异步管道在模板中循环一个可观察对象。