2016-08-10 2 views
6

Этот вопрос уже задан here. Однако, поскольку контекст приложения апеллятора слишком сильно связан с вопросом, я не мог понять основы. Например, есть параметр queryArr. Что оно делает?Как сделать синхронные HTTP-вызовы угловыми 2

В любом случае, мне нужно немного узнать о том, как сделать синхронные HTTP-вызовы простейшим способом. Решение, которое я придумал, заключается в том, что нужно подписываться на наблюдаемые в «вложенном» порядке. Например, имеются наблюдаемые ox и oy. Данные запроса Называние в 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 много, и я немного новичок), в рамках которой я подписался до oy, xData или yData больше не виден. Пожалуйста, поправьте меня и укажите мне в правильном направлении, если я ошибаюсь.

Есть ли «прекрасное» решение или лучший способ сделать это?

ответ

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.forkJoin и Observable.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.forkJoin] (https://www.learnrxjs.io/operators/combination/forkjoin .html), чтобы распараллелить вызовы http и получить подписку, как только все закончится. – Markus

Смежные вопросы