Angular - 多次订阅抛出错误

问题描述 投票:0回答:2

我想创建此功能:

  1. 为退货项目调用API
  2. items.length> 0 - >调用下一个API
  3. items.length == 0 - >调用另一个API

这是我的代码:

let a = this.http.get("URL");
a.subscribe(response => {
  if(response.data.length == 0)
    Observable.throw({});
});

a.subscribe(x => {console.log("CALL NEXT API")}, error => { console.log("ANOTHER API")}

此代码总是显示“CALL NEXT API”,从不在订阅中调用错误函数。连续调用多个请求和条件的最佳解决方案是什么?

angular
2个回答
1
投票

如果这是你的代码

let a = this.http.get("URL");
a.subscribe(response => {
  if(response.data.length == 0)
    Observable.throw({});
});

a.subscribe(x => {console.log("CALL NEXT API")}, error => { console.log("ANOTHER API")}

不要错过为什么它不起作用。

让我分解你。

首先,进行HTTP调用:

let a = this.http.get("URL");

这里没什么不好的。然后,您订阅一次:

a.subscribe(response => {
  if(response.data.length == 0)
    Observable.throw({});
});

在这里,言语,你这样做:

(没有)

没错,你什么都不做。您所做的就是创建一个可观察的错误,您不会绑定到变量。基本上,你什么都不做。

然后,您进行第二次订阅:

a.subscribe(x => {console.log("CALL NEXT API")}, error => { console.log("ANOTHER API")}

言之,这给出了

如果调用成功,请记录“CALL NEXT API”,如果有错误,请记录“ANOTHER API”。

如果你总是看到CALL NEXT API,那么我假设你只能成功拨打电话。

如果您的目标是进行连续的API调用,则应使用mergeMap运算符,如下所示:

this.http.get('URL')
  .pipe(mergeMap(response1 => {
    this.http.get(response1.data.length ? 'SUCCESS URL' : 'EMPTY ARRAY URL').subscribe(response2 => {
      /* ... */
    });
  }));

0
投票

我可能误解了这个问题,但你不能在订阅回调中调用其他API吗?

this.http('URL').subscribe(response => {
    if (response.data.length == 0) {
        console.log('Call another API');
    }
    else {
        console.log('Call next API');
    }
}, error => {
    console.log('Could not return result');
}

如果成功调用api,即使长度为0,也会返回结果。然后,您可以调用相关的API。

如果访问URL或数据格式不正确等问题,它应该只触及错误回调。

© www.soinside.com 2019 - 2024. All rights reserved.