如果我有一个事件类型;说一个点击事件。我想触发 3 个独特的 ajax 请求,但我想订阅所有 3 个请求的最终结果
这个序列的正确设计模式是什么。
我当前的代码块看起来像这样
$rootScope.$eventToObservable('selectUser')
.throttle(500)
.map(data => {
return angular.copy(data.additionalArguments[0].entity);
})
.select(d => {
return {
Member: MemberService.getMember(d.ID),
otherData: MemberService.dataOtherData(d.ID),
Notes: MemberService.getNotes(d.ID),
Log: MemberService.getLog(d.ID)
}
})
.switchLatest() //Code current dies here with an object is not a function error. I believe because the return object is not an obserable. But not sure what the proper design pattern is.
.subscribe(model => {
//I would like that model would contain an object with the result of the 3 responses above.
$scope.model = model;
});
最佳答案
您可以使用 zip
同步您的请求。 zip
将导致所有可观察对象被订阅,并在每次所有这些可观察对象触发时产生。所以,一旦 n
每个 observable 的第一个项目被生成,zip 将生成它的 n
th 值,它是使用 n
创建的来自原始可观察量的 th 个值。
有了它之后,您可以使用 switchLatest
吗? , 适用于 Observable<Observable<T>>
,并确保它始终订阅最新的可观察对象。因此,如果您选择一个新用户,它只会取消订阅任何待处理的请求,然后订阅下一个请求。
$rootScope.$eventToObservable('selectUser')
.throttle(500)
.map(data => {
return angular.copy(data.additionalArguments[0].entity);
})
.map(entityToExpandedData).switchLatest()
.subscribe(model => {
$scope.model = model;
});
function entityToExpandedData (entity) {
return Rx.Observable
.zip(
MemberService.getMember(d.ID),
MemberService.dataOtherData(d.ID),
MemberService.getNotes(d.ID),
MemberService.getLog(d.ID),
makeExpandedData
);
}
function makeExpandedData (member, otherData, notes, log) {
return {
member: member,
otherData: otherData,
notes: notes,
log: log
};
}
关于javascript - RxJS 在事件上发送多个唯一的 ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24816691/