Как сделать асинхронное уменьшение или уменьшение с помощью rxjs

#ajax #asynchronous #rxjs #observable #reduce

#ajax #асинхронный #rxjs #наблюдаемый #уменьшить

Вопрос:

Привет, я хочу выполнить последовательность запросов ajax, каждый из которых зависит от результата его предшественника.

Моя идея заключалась в том, чтобы сократить список URL-адресов следующим образом:

 var urls = ["http://example.org/foo","http://example.org/bar", "..." ]

Rx.Observable
 .from(urls)
 .reduce((response, url, idx, source)=>{

   return Rx.DOM.ajax({ 
     url: url '?param='  response.yxz, //append some results to the next request
     responseType: 'json'
    }).map(data=>data.response)

 },{yxz:0})
  .subscribe(...
  

Но накопитель для уменьшения ожидает, что будет возвращено «реальное» значение.

Есть ли какой-либо способ выполнить такой вызов flatReduce?

Ответ №1:

Вам не нужно сокращать, потому что вы не хотите накапливать все результаты.

Здесь вы должны думать рекурсивно:

 function tail(list) {
  return list.splice(-1, 1)
}


function request(urls, param) {
  if (urls.length <= 0) return param;
  return Rx.DOM.ajax({
    url: urls[0]   '?param='   param,
    responseType: 'json'
  })
    .map(data => data.response.xyz)
    .flatMap(response => request(tail(urls), response));
}


request(["http://example.org/foo", "http://example.org/bar", "..."], 0)
  .subscribe(...)
  

Комментарии:

1. Привет, майхау, спасибо за ваше предложение, конечно, я думаю, это сработало бы, но я бы оставил программирование функций rxjs с операторами. Возможно, я мог бы попытаться сделать это как пользовательский оператор

Ответ №2:

Я новичок в этом, и мне было интересно то же самое. Решение, которое я придумал, состояло в том, чтобы Array.reduce вместо этого использовать метод:

 var urls = ["http://example.org/foo","http://example.org/bar", "..." ]

urls.reduce((observable, url) => {

    return observable.flatMap(
        (response) => {

            return Rx.DOM.ajax({ 
                url: url '?param='  response.yxz, //append some results to the next request
                responseType: 'json'
            })
            .map(data=>data.response);
        }

}, Observable.of({yxz:0}))
.subscribe(...