Angular5: пакетные вызовы для получения данных для поля в массиве json - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть массив с данными JSON в следующем формате

staff = [
{ "id"   : 1,
   "name" : "Robert"
},
{ "id"   : 2,
   "name" : "Peter"
}
]

Я пытаюсь получить обозначение этих людей. Есть API, который принимает группу идентификаторов. Я пытаюсь получить обозначения партиями по 30. То есть отправлять первые 30 объектов, получать их обозначения и продолжать ... Я пытался сохранить цикл for и пропустить 30 объектов, но безуспешно.

Обозначение API предоставляет данные в следующем формате.

[
  {
    "staffId": "26",
    "designation": "PRA"
  },
  {
    "staffId": "25",
    "designation": "MRA"
  }
]

Результат JSON

персонал = [ {"id": 1, "имя": "Роберт", "staffDesignation": "PRA" }, {"id": 2, "имя": "Питер", "staffDesignation": "MRA" } ]

Так что здесь для каждых 30 партий получаемых обозначений мне нужно обновить штатную запись этим значением.

staff.component.ts

для (пусть i = 0; i <= this.staff.length; i ++) { this.staffService.getStaffDesignator (// должно пройти 30 объектов) .subscribe ((указатель) => {// Здесь передается 30 объектов // обновляем логику указателя }, (ошибка) => {

})

}

staff.service.ts

getStaffDesignator(staff)
{

    staff.forEach((staff, index) => {
      if (index === 0) {
        url = url + `?contactId=${staff.id}`;
      }
      else {
        url = url + `&contactId=${staff.id}`
      }
    }) //loop through the objects to get the staff id to pass to the APIcall

    return this.http.get(url, this.options)
      .map((res: Response) => {
        return res.json();
      })  //API call to get designations for staff

}

Ответы [ 2 ]

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

Пока вы получаете разрешение от вызова API, вы можете начать работать с процессом массива фильтров.

var filterArray = [];

this.http.post(url , param , header , function(err , response) => {
    // First way is to use map
    // You can use for loop 
    for(let i = 0 i < response.length ; i++){
         var obj = {
             id: response[i].staffId,
             name: response[i].name,
             staffDesignation: response[i].designation,
         }
         this.filterArray.push(obj);

         // Now you can call next API for another batch... 
    }
})

В этом случае я предлагаю вам использовать эту структуру ниже.

step1: Создайте массив из 30 пакетов.

step2: Используется для цикла с Observable.

for(let i = 0 ; i < this.array.length ; i++){       //Each i has batch of 30.

     // Hear observable will work as a promise in for loop to make call in sync.
     return new Observable((observer) => {
          return http.post(url , param , option)...

         //Once you got data from API use my above code to filter your
         // Key and value from res. 

        observable.next();
        observable.complete(); // It will go for call next batch... 
     })
}
0 голосов
/ 08 ноября 2018

Учитывая ваши staff данные как:

staff = [{
    "id": 1,
    "name": "Robert"
  },
  {
    "id": 2,
    "name": "Peter"
  }
]

И ваш API возвращает данные в том же порядке, в котором они были запрошены,

Вы можете получить идентификаторы персонала:

staffIds = staff.map(item => item.id);

Как только вы вызовете свой API и получите response, вы можете объединить ответ с массивом staff следующим образом:

resultingArray = Object.values(
  [...staff, ...response]
  .reduce((r, { staffId, id = staffId, ...rest }) => ({
    ...r,
    [id]: { id, ...r[id], ...rest }
  }), {})
);
...