Observable.expand и использовать массив, чтобы сделать один наблюдаемый запрос на основе, используя mergeMap? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть запрос, который может быть несколькими запросами, и каждый из них является наблюдаемым и использует .expand для рекурсивного просмотра каждой наблюдаемой и выполнения запроса.

Когда Count объекта равен> 1, мы выполняем запрос на публикацию и создаем объект obj, а если счетчик равен 0, мы удаляем только что созданный объект obj.Эта часть кода уже существует

Мне нужна помощь, чтобы сделать так, чтобы вместо удаления каждого объекта по его идентификатору я хотел поместить все идентификаторы в массив, а затем отправить массовый запрос на удаление с массивом.из id в качестве полезной нагрузки.

Я пытался использовать switchMap, но не уверен, нужно ли это делать за пределами .expand, или есть лучший метод для наблюдаемых, чтобы сделать это?

У меня естьметод для deleteById тоже.

В следующем существующем коде, не могли бы вы помочь с тем, как это нужно сделать

   return new Promise((resolve, reject) => {
    let temp = [];
    let obj = {};
    let queryIds = [];
    this.restService.observable.post(CREATE, val).expand(response => {
        obj = response.json();
        if (obj && obj.Count > 0) {
            return this.restService.observable.get(`${GET_NEXT}?id=${obj.id}`);
        } else if (obj && obj.Count === 0) {
            //returns an observable of each obj's id for delete request
            //return this.restModuleService.observable.get(`${DELETE}?id=${obj.id}`);
            //instead need to push the id's into an array 
            and make a delete request on teh array of ids
            //queryIds.push(obj.id);
            //return Observable.empty();

        } else {
            return Observable.empty();
        }
    })**.toArray().mergeMap(objects => {
            const objArray = objects.map(obj => obj.json());
            const toDelete = objArray.filter(obj => obj.remainingCount === 0);
            return this.deleteByIds(toDelete);
    })**.map(res => res.json()).subscribe(data => {
        if (data) {
            temp.push.apply(temp, data.results);
        }
    });

);

Метод deleteById

   deleteByIds(queryIds, cb) {
    var data = {
        data: {
            ids: []
        }
    };
    for (var i = 0; i < queryIds.length; i++) {
        data.data.ids.push(queryIds[i]);
    }
    let payload = JSON.stringify(data);
    return this.restService.post('deleteBulk', payload)
        .then(response => response.json())
        .catch((error) => {
        });
}

1 Ответ

0 голосов
/ 30 мая 2018

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

doRequestForObject(1)
  .expand(obj => {
    if(obj.count == 0) {
      return Rx.Observable.empty();
    }
    /* keep getting objects */
    return doRequestForObject(1 + obj.id);
  })
  .toArray()
  .mergeMap(objects => {
    /* in here objects is an array so we can use Array.filter() */
    const toDelete = objects.filter(obj => obj.count === 0);
    return deleteObjects(toDelete)
      .concat(Rx.Observable.of(objects.filter(obj => obj.count > 0)));
  })
  .subscribe(console.log, console.log, () => console.log("done"));


function doRequestForObject(i) {
  return Rx.Observable.of({
    id: i,
    count: i % 5
  });
}

function deleteObjects(idArray) {
  console.log('deleting: ' + JSON.stringify(idArray));
  return Rx.Observable.empty();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.11/Rx.js"></script>
...