#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(...