сделать синхронизацию http поста с помощью Observable в Angular - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь реализовать это, но мне нужна помощь (я новичок в этом).

У меня сейчас есть,

constructor(http: HttpClient, private cvservice: CvService) {
const req = http.post<any>('url', [{
            "name": "ids",
            "license": "GPL version 2"
}])
  .subscribe(
    res => {
    console.log(res);
    var resp = res.Results[0].results.map(x => {
            return {cvid: x.ID, severity: x.CVSS };
    } );
   this.data = [...resp];
    },
    err => {
      console.log("Error occured");
    }
  );
}

Это прекрасно работает, за исключением того, что мне нужно синхронизировать http.post (для продолжения нужны результаты [0]), и я использую предложение от, Как синхронизировать Angular2 http get? .

Я изменил службу как,

export class CvService {
constructor(private http: HttpClient) {
}
url = 'foo';
getIds():Observable<any[]> {
const url='xxx';
return this.http.post(url, [{
            "name": "ids",
            "license": "GNU General Public License GPL version 2"
        }])
        .map(
            res =>  {
                res.Results[0].results.map( x => {
                   return {cvd: x.ID, severity: x.CVSS };
}));
}
}
}

Но я думаю, что этот синтаксис неправильный. Это дает ошибку компиляции. Может кто-нибудь уточнить, пожалуйста, правильный способ использования функции карты здесь

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете реализовать это так:

Услуги

saveUser(): Observable<any> {
    const data = [{"name": "ids", "license": "GNU General Public License GPL version 2"}];

    // For Angular v5 below
    this.http
      .post(url, data)
      .map(res => res.json());       // or .map(res => res), depends what your fetching with

    OR you can pipe it out (Angular 6+)

    this.http
      .post(url, data)
      .pipe(map(({ Results }: any) => Results[0].results.map(item => ({cvid: item.ID, severity: item.CVSS }))));

    // Based from you code when you accessed it this way: res.Results[0].results.map( x => {return {cvd: x.ID, severity: x.CVSS };
}

Компонент

this.userService
   .saveUser()
   .subscribe(data => console.log(data));

Для вашей справки создал Stackblitz demo - он использует разные данные и поддельный POST API только для демонстрационных целей.

0 голосов
/ 06 ноября 2018

импортировать карту из rxjs и использовать ее внутри трубы вот так

return this.http.post(URL, Object)
 .pipe(map(data) => {
    return data['result'].map(res => {
   // Here You can return the entire res, or just the properties you want
   // EX: --> return res OR --> return res.cvd
   });
});

также, сделайте объект снаружи

let cv = [{
  name: "ids",
  license: "GNU General Public License GPL version 2"
}];

Вы можете использовать его тогда, как это

return this.http.post(URL, cv);
...