вернуть правильный объект из углового http.get с обещанием - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть функция http get, которая захватывает структуру данных, но я действительно хотел бы иметь фактический объект (у меня есть функции для него).

public async get(guid: string): Promise<PctLayer>
{
    return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header }).toPromise();
}

Я могу решить это с помощью

let layer = Object.assign(new PctLayer(), await this.layerService.get(info.id));

, который делает работу хорошо.Есть ли способ переместить Object.assign в асинхронное получение?Я не смог заставить его работать вместе с Promise, т.е. я не уверен, как по-прежнему возвращать Promise, когда я вызываю Object.assign в асинхронном get.

Я знаю, что вместо использования другого решения естьObject.assign, но они содержат намного больше кода, и мне нравится, чтобы код был коротким и простым в использовании.

1 Ответ

0 голосов
/ 02 апреля 2019
return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header })
.map(r => {
  Object.assign(new PctLayer(), r);
})
.toPromise()

Может работать на вас.Просто включите Object.assign в наблюдаемую цепочку, прежде чем сопоставить ее с обещанием

Редактировать

Поскольку я из эры RxJS 5, ниже также версия 6.x:

return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header })
.pipe(map(r => {
  Object.assign(new PctLayer(), r);
}))
.toPromise()

Еще одно редактирование

В моих предварительных проектах, когда мне нужно внедрить данные из HTTP-выборки в объект, я обычно просто создаю новый объект с REST-ответом в качестве входного параметра:

export interface MyClassInterface {
  A: string;
}
export class MyClass implements MyClassInterface{
  public A: string;
  constructor(iIn: MyClassInterface) {
    this.A = iIn.A
    /* and so on */
  }
  public myUsefulFinction() { /*Do stuff*/ }
}

Тогда, предполагая, что GET-ответ совместим с интерфейсом, вы можете просто

return await this.http.get<PctLayer>(`${this.url}/${guid}`, { headers: this.header })
.pipe(map(ifc => MyClass(ifc)))
.toPromise()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...