Angular 当没有要传递的流时,在flatMaps之后,rxjs中应该调用什么方法而不是订阅?

Angular 当没有要传递的流时,在flatMaps之后,rxjs中应该调用什么方法而不是订阅?,angular,rxjs,observable,Angular,Rxjs,Observable,我有一个方法,将其作为表单管理的一部分,并执行以下操作。我可以很容易地用承诺解决这样的问题,但现在是学习可观察性的时候了!因此,该方法的任务是: 调用clientWebApiService.getClients()以获取客户端列表,并返回environmentWebApiService.getEnvironmentsNotInPipeline()的可观察值 在第二个flatMap中,结果将传递给局部变量 在subscribe中,我想映射另一个数据结构,以便能够设置表单的内容 subscrib

我有一个方法,将其作为表单管理的一部分,并执行以下操作。我可以很容易地用承诺解决这样的问题,但现在是学习可观察性的时候了!因此,该方法的任务是:

  • 调用
    clientWebApiService.getClients()
    以获取客户端列表,并返回
    environmentWebApiService.getEnvironmentsNotInPipeline()的可观察值
  • 在第二个flatMap中,结果将传递给局部变量
  • subscribe
    中,我想映射另一个数据结构,以便能够设置表单的内容
subscribe()
抛出以下错误:

ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at Object.subscribeToResult (subscribeToResult.js:73)
    at MergeMapSubscriber._innerSub (mergeMap.js:130)
    at MergeMapSubscriber._tryNext (mergeMap.js:127)
我已经(希望)发现subscribe需要一个这里没有提供的流。如果我看到的是正确的,那么第二个平面图应该返回一个由
subscribe()
处理的可观察对象。在这个结构中没有。在这种情况下,应该调用什么方法?我发现rxjs有很多方法。我不知道我在找哪一个

我试图重新构造代码,但如果没有
subscribe()
,则无法执行

  • 这样的最佳实践案例是什么
public editHandler({dataItem}):void{
让客户:IClientContract[];
let环境:IEnEnvironmentContract[];
this.clientWebApiService.getClients()
.flatMap((客户端结果:任意):可观察=>{
clients=clientsResult作为IClientContract[];
console.log('1',客户端);
返回此.environmentWebApiService.getEnvironmentsNotInPipeline();
})
.flatMap((环境结果:IEnvironmentContract[]):any=>{
环境=环境结果;
console.log('2',环境);
})
.订阅(()=>{
console.log('3');
让editableDeploymentItem:IDeployableEnvironmentForm=this.deployableEnvironmentContractMapperService
.mapDeployableEnvironmentContractToDeployableEnvironmentForm(
数据项,
客户,
环境);
console.log('4',editableDeploymentItem);
this.editDeployment=editableDeploymentItem;
this.isNew=false;
});
}

而是使用
this.clientWebApiService.getClients().flatMap(()=>{})
您可以使用
this.clientWebApiService.getClients().map(()=>{})试试吗


阅读可能会有帮助

而不是使用
this.clientWebApiService.getClients().flatMap(()=>{})
您可以使用
this.clientWebApiService.getClients().map(()=>{})试试吗


阅读可能有帮助

你应该使用
do
<代码>执行
操作员只需执行一个操作并继续执行蒸汽。在你的例子中,我不明白你为什么需要另一个操作符,因为它可以在
subscribe
方法本身中完成

您只需执行以下操作:

public editHandler({ dataItem }): void {

        let clients: IClientContract[];
        let environments: IEnvironmentContract[];

        this.clientWebApiService.getClients()
            .flatMap((clientsResult: any): Observable<IEnvironmentContract[]> => {
                clients = clientsResult as IClientContract[];
                console.log('1', clients);
                return this.environmentWebApiService.getEnvironmentsNotInPipeline();
            })
            .subscribe((environmentResult: IEnvironmentContract[]): any => {
                environments = environmentResult;
                console.log('2', environments);
                console.log('3');
                let editableDeploymentItem: IDeployableEnvironmentForm = this.deployableEnvironmentContractMapperService
                    .mapDeployableEnvironmentContractToDeployableEnvironmentForm(
                    dataItem,
                    clients,
                    environments);
                console.log('4', editableDeploymentItem);

                this.editDeployment = editableDeploymentItem;
                this.isNew = false;
            });
    }
public editHandler({dataItem}):void{
让客户:IClientContract[];
let环境:IEnEnvironmentContract[];
this.clientWebApiService.getClients()
.flatMap((客户端结果:任意):可观察=>{
clients=clientsResult作为IClientContract[];
console.log('1',客户端);
返回此.environmentWebApiService.getEnvironmentsNotInPipeline();
})
.subscribe((环境结果:IEnvironmentContract[]):any=>{
环境=环境结果;
console.log('2',环境);
console.log('3');
让editableDeploymentItem:IDeployableEnvironmentForm=this.deployableEnvironmentContractMapperService
.mapDeployableEnvironmentContractToDeployableEnvironmentForm(
数据项,
客户,
环境);
console.log('4',editableDeploymentItem);
this.editDeployment=editableDeploymentItem;
this.isNew=false;
});
}

您应该使用
do
<代码>执行
操作员只需执行一个操作并继续执行蒸汽。在你的例子中,我不明白你为什么需要另一个操作符,因为它可以在
subscribe
方法本身中完成

您只需执行以下操作:

public editHandler({ dataItem }): void {

        let clients: IClientContract[];
        let environments: IEnvironmentContract[];

        this.clientWebApiService.getClients()
            .flatMap((clientsResult: any): Observable<IEnvironmentContract[]> => {
                clients = clientsResult as IClientContract[];
                console.log('1', clients);
                return this.environmentWebApiService.getEnvironmentsNotInPipeline();
            })
            .subscribe((environmentResult: IEnvironmentContract[]): any => {
                environments = environmentResult;
                console.log('2', environments);
                console.log('3');
                let editableDeploymentItem: IDeployableEnvironmentForm = this.deployableEnvironmentContractMapperService
                    .mapDeployableEnvironmentContractToDeployableEnvironmentForm(
                    dataItem,
                    clients,
                    environments);
                console.log('4', editableDeploymentItem);

                this.editDeployment = editableDeploymentItem;
                this.isNew = false;
            });
    }
public editHandler({dataItem}):void{
让客户:IClientContract[];
let环境:IEnEnvironmentContract[];
this.clientWebApiService.getClients()
.flatMap((客户端结果:任意):可观察=>{
clients=clientsResult作为IClientContract[];
console.log('1',客户端);
返回此.environmentWebApiService.getEnvironmentsNotInPipeline();
})
.subscribe((环境结果:IEnvironmentContract[]):any=>{
环境=环境结果;
console.log('2',环境);
console.log('3');
让editableDeploymentItem:IDeployableEnvironmentForm=this.deployableEnvironmentContractMapperService
.mapDeployableEnvironmentContractToDeployableEnvironmentForm(
数据项,
客户,
环境);
console.log('4',editableDeploymentItem);
this.editDeployment=editableDeploymentItem;
this.isNew=false;
});
}