为了账号安全,请及时绑定邮箱和手机立即绑定

当上一个 api 成功完成后,如何对 api 进行新的调用?

当上一个 api 成功完成后,如何对 api 进行新的调用?

慕森卡 2023-09-07 17:02:40
我是 Angular 和 rxjs 的新手,我有以下场景,在该场景中,我需要在成功解析对 api 的调用后进行新的调用,在 Angular / rxjs 的上下文中我不知道该怎么做它handler(): void {  this.serviceNAme    .createDirectory(this.path)    .pipe(      finalize(() => {        this.someProperty = false;      })    )    .subscribe(      (data) => console.log(data),      (error) => console.error(error.message)    );}当上一个 api 成功调用时,重新调用 api 的正确方法是什么?
查看完整描述

3 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

我知道你有 aserviceOne和 a serviceTwo。并且您想serviceTwo使用从 检索到的数据进行调用serviceOne

使用 rxjs switchMap您可以将一个可观察值通过管道传输到另一个可观察值中。

  handler(): void {

        this.serviceOne

            .createDirectory(this.path)

            .pipe(

                switchMap(serviceOneResult => {

                    // transform data as you wish

                    return this.serviceTwo.methodCall(serviceOneResult);

                })

            )

            .subscribe({

                next: serviceTwoResult => {

                    // here we have the data returned by serviceTwo

                },

                error: err => {},

            });

    }

如果您不需要从serviceOne到传递数据serviceTwo,但需要它们一起完成,则可以使用 rxjs forkJoin。

  handler(): void {

        forkJoin([

            this.serviceOne.createDirectory(this.path), 

            this.serviceTwo.methodCall()

        ])

        .subscribe({

            next: ([serviceOneResult, serviceTwoResult]) => {

                // here we have data returned by both services

            },

            error: err => {},

        });

    }


查看完整回答
反对 回复 2023-09-07
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

使用aysncandawait你可以这样做:


async handler(): void {

  await this.serviceNAme

    .createDirectory(this.path)

    .pipe(

      finalize(() => {

        this.someProperty = false;

      })

    )

    .subscribe(

      (data) => console.log(data),

      (error) => console.error(error.message)

    );


   // Do second api call

}


查看完整回答
反对 回复 2023-09-07
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

有一些说法可以做到这一点:


场景#1

您的两个服务 api 调用是独立的,您只想调用一个,然后调用下一个


 const serviceCall1 = this.serviceName.createDirectory(this.path);

 const serviceCall2 = this.serviceName.createDirectory(this.otherPath);


 concat(serviceCall1 , serviceCall2).subscribe({

   next: console.log,

   error: err => console.error(err.message),

   complete: () => console.log("service call 1&2 complete")

 });

场景#2

您的两个调用相互依赖,因此您需要第一个调用的结果才能开始第二个调用


 this.serviceName.getDirectoryRoot().pipe(

   switchMap(root => this.serviceName.createDirectoryInRoot(root, this.path))

 ).subscribe({

   next: console.log,

   error: err => console.error(err.message),

   complete: () => console.log("service call 1 used to create service call 2, which is complete")

 });

您将需要方案 # 2,因为这样做,第一次调用中的错误将意味着没有结果发送到switchMap,并且永远不会进行第二次调用。


查看完整回答
反对 回复 2023-09-07
  • 3 回答
  • 0 关注
  • 126 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信