Angular - 多次订阅抛出错误

时间:2018-03-01 08:07:57

标签: angular

我想创建此功能:

  1. 为退货项目调用API
  2. items.length> 0 - >调用下一个API
  3. items.length == 0 - >调用另一个API
  4. 这是我的代码:

    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”,从不在订阅中调用错误函数。 连续调用多个请求和条件的最佳解决方案是什么?

2 个答案:

答案 0 :(得分: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 => {
      /* ... */
    });
  }));

答案 1 :(得分: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或数据格式不正确等问题,它应该只会遇到错误回调。