2016-08-10 80 views
6

此问题已被要求here。然而,由于提问者的应用环境涉及太多的问题,我无法理解基础知识。例如,有一个queryArr参数。它有什么作用?如何进行角度同步http呼叫2

无论如何,我需要一点关于如何以最简单的方式进行同步http调用的指导。我提出的解决方案是,必须以“嵌套”顺序订阅观察数据。例如,有可观察到的oxoy。被称为在oy请求的数据依赖于数据来自ox

xData: string = ""; 
yData: string = ""; 

ox.subscribe(
    data => {xData = data;}, 
    error => console.log(error), 
    () => { 
     oy.subscribe(
      data => {yData = xData*data;}, 
      error => console.log(error), 
      () => console.log("aaa") 
     ); 
    } 
); 

上次我记得(我不这样做的JavaScript多,我有点新手),在我订阅范围到oyxDatayData不能再被看到。如果我错了,请纠正我并指向正确的方向。

有没有什么“好”的解决方案或更好的方法来做这种事情?

回答

5

我认为你可以看看flatMap运算符执行一个HTTP请求,等待它的响应并执行另一个。

这里有一个例子:

executeHttp(url) { 
    return this.http.get(url).map(res => res.json()); 
} 

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return this.executeHttp('http://...'); 
    }).subscribe(result => { 
    // result is the result of the second request 
    }); 
} 

如果你想有机会获得在subscribe方法两个结果,你可以利用Observable.forkJoinObservable.of

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return Observable.forkJoin([ 
     Observable.of(result), 
     this.executeHttp('http://...'); 
    }).subscribe(results => { 
    // result is the result of both requests 
    let result1 = results[0]; 
    let result2 = results[1]; 
    }); 
} 
+5

这似乎使多个连锁http请求,但问题很简单,如何进行同步http请求,我不明白这是如何回答的。 – Neutrino

+0

一个http请求将永远不会同步,您需要有适当的软件设计(基于Observable),并且应该查看提及的[Observable.forkJoin](https://www.learnrxjs.io/operators/combination/forkjoin .html)运营商为了并行化http呼叫并在所有完成后获得订阅。 – Markus