2016-12-10 6 views
0

Моя проблема довольно сложная. Ситуация выглядит следующим образом:Выполнение http-запроса со свойствами из переменной, которая поступает из другого запроса http

У меня есть функция:

private updateWatchlistTable(name) { 
    this._watchlistElements = []; 
    this.http.get('http://localhost:8080/getPoints/' + name) 
    .subscribe(res => this._watchlistElements = res.json()); 
} 

Какой скачивает JSON файл с сервера, который выглядит как: [{"xid":"DP_049908","name":"t10"},{"xid":"DP_928829","name":"t13"},{"xid":"DP_588690","name":"t14"}]

и сохраняет его внутри: private _watchlistElements: Array<WatchlistComponent> = []; переменной.

На данный момент все работает хорошо.

И теперь, у меня есть еще одна функция:

private getValues() { 
this._watchlistElements.map((v => this.http.get('http://localhost:8080/getValue/' + v.xid) 
.subscribe(res => this._values = res.json()))); 
} 

Какие данные загрузки для каждой точки xid от переменной _watchlistElements. Ответ, который приходит (только в этом случае) "xid": "DP_049908" момент выглядит следующим образом:

{"value":"32.339264","ts":1476778297100,"xid":"DP_049908"}

В чем проблема?

Проблема заключается в том, что эта вторая функция getValues() не в состоянии выполнить эти HTTP вызовы, потому что в основном он не может видеть xid свойство из переменной _watchlistElements. Я не уверен на 100%, но я думаю, что это вызвано тем фактом, что эти вызовы ASYNCHRONOUS. Эта вторая функция getValues() - при выполнении - не имеет доступа к свойствам _watchlistElements, так как содержимое этой переменной также загружается из асинхронного запроса.

Если я делаю это статически, сохраняя эти jsons в отдельных файлах - все работает хорошо.

Как выглядит ошибка?

ERROR в [по умолчанию] C: \ Users \ SRC \ приложение \ appBody \ Список наблюдения \ watchlist.component.ts: 51: 115 Свойство 'XID' не существует на типе 'WatchlistComponent'.

Любая помощь очень ценится!

ответ

0

Используйте return, .then(), чтобы позвонить второй функции, когда Promise в начале функция выполнена. Используйте Promise.all() при втором вызове, чтобы вернуть все значения обещаний, возвращенные с .map(), чтобы позвонить в цепочку .then().

private updateWatchlistTable(name) { 
    this._watchlistElements = []; 
    // note `return` 
    return this.http.get('http://localhost:8080/getPoints/' + name) 
    .subscribe(res => this._watchlistElements = res.json()); 
} 

private getValues() { 
let _this = this; 
// note `return` 
return Promise.all(this._watchlistElements 
.map(v => _this.http.get('http://localhost:8080/getValue/' + v.xid) 
.subscribe(res => _this._values = res.json()))); 
} 

updateWatchlistTable(name) 
.then(getValues) 
// do stuff with `result` 
.then(result => console.log(result)) 
.catch(e => console.log(e)); 
+0

Эта третья функция обязательна? Или это просто альтернатива для первого? –

+0

Нет. Последний '.then()' не нужен, если вы обращаетесь к значениям в другой части 'javascript' – guest271314

+0

' Promise.all() 'может не понадобиться, если' .map() 'не' Array .prototype.map() 'и' .subscribe() 'возвращает объект' Promise'. – guest271314