Angular2 Rx - 堆叠的http.get()太早返回

时间:2017-08-19 17:17:46

标签: angular typescript rxjs

这是我的堆栈http.get的代码,它会检索一个对象,然后检索对象的详细信息:

getDetails(sysID:string){

  console.log("entered getDetails");

  var details;
  this.http.get('https://blahURL').map(res => res.json()).subscribe(
   (data) => details = data,        // Reach here if res.status >= 200 && <= 299
   (err) => console.log(err),       // Reach here if fails
   ()==>{                           // On completion

     console.log("reached end of first get");

     this.http.get(...).map(res2 => res2.json()).subscribe(
        (data2) => {return data2;
        ...

这是通过console.log(getDetails(sysID));调用的。所以我期望的是当第二个this.http.get()收到一个结果时,它会被传递给调用者并在控制台中打印出来。 但是,我在控制台中得到的是: entered getDetails然后undefined,仅在reached end of first get

之后

我如何强制它等待第二个http.get结果?

2 个答案:

答案 0 :(得分:1)

你想要等待第二个请求,直到返回响应,所以你应该做(链接两个调用) 见(How to chain Http calls in Angular2)。

答案 1 :(得分:0)

除了在完成事件中处理它之外,如果对象为空或未定义,您还可以添加skipWhile以防止subscription

this.http.get('https://blahURL').map(res => res.json())
   .skipWhile(data=> {if(data) return true;}) ///////////////////////
   .subscribe(
   (data) => details = data,        // Reach here if res.status >= 200 && <= 299
   (err) => console.log(err),       // Reach here if fails
   ()==>{                           // On completion

     console.log("reached end of first get");

     this.http.get(...).map(res2 => res2.json()).subscribe(
        (data2) => {return data2;
        ...

因此,在第一个订阅中,将按照skipWhile跳过它。第二次订阅它将拥有数据,相应的流程将按原样