2016-08-10 21 views
6

Câu hỏi này đã được hỏi here. Tuy nhiên, vì ngữ cảnh ứng dụng của người hỏi có liên quan quá nhiều trong câu hỏi, tôi không thể hiểu được những điều cơ bản. Ví dụ: có thông số queryArr. Nó làm gì?Cách thực hiện cuộc gọi http đồng bộ ở góc 2

Dù sao, tôi cần một chút hướng dẫn về cách thực hiện cuộc gọi http đồng bộ một cách đơn giản nhất. Giải pháp tôi đưa ra là người ta phải đăng ký các quan sát theo thứ tự "lồng nhau". Ví dụ: có các quan sát oxoy. Dữ liệu của các yêu cầu được gọi oy là phụ thuộc vào dữ liệu đến từ 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") 
     ); 
    } 
); 

Thời gian qua tôi nhớ (tôi không làm javascript nhiều, và là một chút newbie), trong phạm vi nơi tôi đăng ký đến oy, không thể xem được xData hoặc yData nữa. Hãy sửa tôi và chỉ cho tôi đúng hướng nếu tôi sai.

Có giải pháp "tốt" nào hay cách tốt hơn để thực hiện việc này không?

Trả lời

5

Tôi nghĩ rằng bạn có thể xem nhà điều hành flatMap để thực hiện yêu cầu HTTP, chờ phản hồi của nó và thực hiện một yêu cầu khác.

Đây là một mẫu:

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 
    }); 
} 

Nếu bạn muốn được tiếp cận với cả hai kết quả trong phương pháp subscribe, bạn có thể tận dụng 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

này dường như làm cho nhiều xích http yêu cầu, nhưng câu hỏi là đơn giản như thế nào để thực hiện một yêu cầu http đồng bộ, mà tôi không thấy làm thế nào câu trả lời này. – Neutrino

+0

Yêu cầu http sẽ không bao giờ đồng bộ, bạn sẽ cần phải có thiết kế phần mềm phù hợp (Có thể quan sát được) và nên xem [Observable.forkJoin] đã đề cập (https://www.learnrxjs.io/operators/combination/forkjoin .html) để thực hiện song song các cuộc gọi http và nhận đăng ký khi tất cả đã hoàn tất. – Markus

Các vấn đề liên quan