簡體   English   中英

多個順序 api 調用 RxJs

[英]Multiple sequential api calls RxJs

我需要使用 RxJs 進行順序 api 調用。 問題是第一個 Observable 發出一個數組,對於這個數組的每個項目,我應該設置一個自定義 url 以便進行下一次調用。 在第二次調用中,我應該檢查一些條件並返回 Observable。 我的問題是,如何調用數組的每個元素,因為它的 url 發生了變化?

我試過這樣的事情,但它只為最后一個項目設置 url,而不是每個項目。

  private func(): Observable<boolean> {
    return this.service
      .getItems()
      .pipe(
        map((response) => response.items),
        mergeMap((result) => {
          result.map((order) =>
            this.orderService.setCustomUrl(order.number)
          );
          return this.orderService.getItems().pipe(
            mergeMap((response) => {
              if (response.items.some((item) => item.number === this.model.number)) {
                return of(true);
              } else {
                return of(false);
              }
            }),
          );
        })
      );
  }

這就是您的代碼中發生的事情:

        {
          // for each "result" array element, call "this.orderService.setCustomUrl(order.number)"
          result.map((order) =>
            this.orderService.setCustomUrl(order.number)
          );
          // assuming "setCustomUrl" is setting the one variable, this will cause only the last "order.number" to be set at this point here

          // then this last part executes once and returns the boolean only for the last order
          return this.orderService.getItems().pipe(
            mergeMap((response) => {
              if (response.items.some((item) => item.number === this.model.number)) {
                return of(true);
              } else {
                return of(false);
              }
            }),
          );
        }

我認為目的是驗證this.orderService.getItems()使用order.number返回的任何訂單是否具有來自this.model.number的項目編號,因此您應該改為執行以下操作:

首先更改您的服務調用,以便它可以使用這樣的訂單號this.orderService.getItems(order.number)

然后是以下內容:

private func(): Observable<boolean> {
    return this.service
      .getItems()
      .pipe(
        switchMap((orders) =>
          from(orders.items).pipe(
// for each item on the initial response return an observable,
// mapping its result to a boolean as your initial function
            mergeMap((order) =>
              this.orderService
                .getItems(order.number)
                .pipe(map((itemsResponse) => itemsResponse.items.some((item) => item.number === this.model.number)))
            )
          )
        ),
// this will get all the observable boolean values and only yield when all resolve
        toArray(),
// this aggregates all boolean vals into one
        map((all) => all.some((x) => x)),
// and we complete the subscription after first yield
        take(1)
      )

這樣做的原因是您調用setCustomUrl()但在map()完成之前不使用.getItems() 因此,當您調用.getItems()時,服務已從您的.map()收到最后一項。

您可以使用以下代碼來獲得所需的結果。

function func(): Observable<boolean> {
  return this.service
    .getItems()
    .pipe(
      map((response) => response.items),
      switchMap(items => from(items).pipe(
        concatMap(item=>{
          this.orderService.setCustomUrl(item.number);
          return this.orderService.getItems().pipe(
            map(response => response.items.some((item) => item.number === this.model.number))
          );
        }),
        toArray()
      )),
      map(items => items.some(item => item))
    );
}

from()運算符轉換一個數組,並單獨發出每個值。 這是我們 pipe 並返回.some() boolean 的地方。

toArray()獲取所有這些值並將其轉換回數組。

然后我們執行最后一個map()來查看所有項目是否為真。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM