Отмена цепочки последовательных асинхронных запросов - PullRequest
0 голосов
/ 30 июня 2018

Допустим, пользовательский ввод запускает http-запрос A, с результатом A приложение должно сделать еще один запрос B и показать окончательный результат.

Если получен новый пользовательский ввод, все запросы http должны быть отменены.

Пример, который у меня есть, это цепочка switchMaps. Новые клики прервут и перезапустят первый запрос switchMap. Новый вывод из первого switchMap отменит и перезапустит 2-й. Но щелчок не перезапустит 2-ую карту-свитч.

Буду признателен за предложения о том, как это переосмыслить. Цель - отмена запросов, а фильтрация / игнорирование результатов - обман.).

http://jsbin.com/roranoh/4/edit?js,console

function obFc(name) {
  return {
    next: function (x) { console.log(name+ ' - ' + x)  },
    error: function (err) { console.log(name +' error ' + err) },
    complete: function () { console.log(name +' done') },
  }
};

function simulateHttp(val: any, delay:number) {
    return Rx.Observable.of(val).delay(delay);
}

click1$ = Rx.Observable.of('1').delay(1000);
click2$ = Rx.Observable.of('2').delay(4000);

click$ = Rx.Observable.merge( click1$, click2$ );
click$.subscribe( obFc('Click') );

click$
  .switchMap( (val) => {
    console.log('Fetching data A' + val);
    return simulateHttp(val + " A", 2000);
  })
  .do((v)=> console.log('received:' + v))
  .switchMap( val => {
    console.log('Fetching data B')
    return simulateHttp( val + " B", 2000);
  })
  .subscribe( obFc('Finished ') );

PS: я видел несколько похожих вопросов, хотя они кажутся очень конкретными, я старался быть как можно более общим.

1 Ответ

0 голосов
/ 30 июня 2018

Просто переместите второй switchMap так, чтобы он был непосредственно связан с simulateHttp, который находится внутри первого switchMap:

click$
  .switchMap( (val) => {
    console.log('Fetching data A' + val);
    return simulateHttp(val + " A", 2000)
      .do((v)=> console.log('received:' + v))
      .switchMap(val => {
        console.log('Fetching data B')
        return simulateHttp(val + " B", 2000);
      });
  })
  .subscribe(obFc('Finished'));

Затем, когда произойдет еще один щелчок, вся цепочка, состоящая из внешнего switchMap, будет отписана.

Кроме того, внутренний switchMap никогда не будет нуждаться в переключении - поскольку наблюдаемая HTTP будет излучать только один раз - так что вместо этого можно было бы использовать mergeMap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...