如何一个接一个地调用异步函数?

四哦四

这就是我所拥有的:

  ngOnInit() {
    this._addServ.getDefaultAddress().subscribe((res)=>{
      if(res.status){
        //I need these next two functions to finish their async API requests 
        //before selectNormalDelivery is called
        this.selectShippingAddress();
        this.selectBillingAddress();
        this.selectNormalDelivery();
      }
    })
  }

我需要selectShippingAddressselectBillingAddress完成他们的电话,然后selectNormalDelivery被调用。我怎样才能做到这一点?我不想将它们转换为承诺,因为它们在其他时候不需要被链接。这是否涉及.then

这是函数的代码:

  selectShippingAddress(){
    this.addressService.setShippingAddresses(this.cartService.shippingAddress.address_id).subscribe((res) => {
      console.log('Set shipping address!')
      console.log(res);
    }, err => {
      console.log('Failed to set shipping address')
      console.log(err);
    })
  }

  selectBillingAddress(){
    this.addressService.setPaymentAddresses(this.cartService.billingAddress.address_id).subscribe((res) => {
      console.log('Set billing address!')
      console.log(res);
    }, err => {
      console.log('Failed to set billing address')
      console.log(err);
    })
  }

如果我尝试 a .then,我会收到错误Property 'then' does not exist on type 'void'.,这是有道理的,因为我不想返回任何东西,我只需要他们为了 API 完成调用。

建议?

迈克尔·D

如果我理解正确,您需要听一个 observable (from getDefaultAddress()),然后处理另外两个 observables ( this.addressService.setShippingAddresses()and this.addressService.setPaymentAddresses()),然后调用 function selectNormalDelivery()

您可以通过使用 RxJS switchMapcatchErrortap运算符和forkJoin(). 尝试以下

import { forkJoin, EMPTY } from 'rxjs';
import { tap, catchError, switchMap } from 'rxjs/operators';

ngOnInit() {
  this._addServ.getDefaultAddress().pipe(
    switchMap((res) => {        // <-- map the observable from `getDefaultAddress()` to another observable
      if(res.status) {
        return forkJoin([       // <-- `forkJoin` emits only after the observables complete
          this.selectShippingAddress(), this.selectBillingAddress()
        ])
      }
    })
  ).subscribe(response => {
    this.selectNormalDelivery()
  })
}

selectShippingAddress() {
  return this.addressService.setShippingAddresses(this.cartService.shippingAddress.address_id).pipe(
    tap((res) => {            // <-- `tap` doesn't alter the response
      console.log('Set shipping address!')
      console.log(res);
    }),
    catchError((err) => {     // <-- `catchError` must return an observable
      console.log('Failed to set shipping address')
      console.log(err);
      return EMPTY;
    }))
}


selectShippingAddress() {
  return this.addressService.setPaymentAddresses(this.cartService.shippingAddress.address_id).pipe(
    tap((res) => {
      console.log('Set billing address!')
      console.log(res);
    }),
    catchError((err) => {
      console.log('Failed to set billing address')
      console.log(err);
      return EMPTY;
    }))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该如何调用3个函数才能一个接一个地执行它们?

一个接一个地调用脚本

如何执行多个异步请求,一个接一个地启动

仅当条件在 swift 中匹配时,如何一个接一个地调用转义函数?

如何调用一个类中包含的异步函数?

如何以组方式调用一个异步函数?

如何创建一个函数管道,以便函数一个接一个地运行?

如何一个接一个地调用方法?

如何一个接一个地使用asynch任务调用REST API

如何一个接一个地执行jQuery函数

Elixir:一个接一个地运行一个函数

尝试使用 JS 一个接一个地运行一个函数

为什么一个函数在调用另一个异步函数时是异步的?

如何一个接一个地运行一个线程?

如何在另一个异步函数中调用异步函数

一种接一个地调用函数的替代方法

用异步管道一个接一个地执行Observable

一个接一个地执行非阻塞异步任务

等待一个递归调用异步函数的函数

如何在python中一个接一个地执行两个函数并获得所需的输出

使用RxJS如何缓冲函数调用,直到解决了另一个异步函数调用

在AngularJS中一个接一个地执行两个函数

Spring和Angular:如何在一个条件下一个接一个地进行两个http调用

Android异步任务一个接一个

递归调用异步函数返回一个Promise

Flutter 异步加载多个函数一个接一个

一个接一个地调用 axios 请求?

在Angular中一个接一个地同步调用可观察对象

一个接一个地调用AjaxLink中的几个不同的JavaScript