1

如果我有一个事件类型;说一个点击事件。我想触发 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;
});
4

1 回答 1

4

您可以使用它zip来同步您的请求。zip将导致订阅所有可观察对象,并在每次所有这些可观察对象触发时产生。因此,一旦n产生了每个 observable 的第 th 项,zip 将产生它的n第 th 值,该值是通过使用n原始 observable 中的第 th 值创建的。

一旦你有了它,你可以使用switchLatest, 它在 上工作Observable<Observable<T>>,并确保它总是订阅最新的 observable。因此,如果您选择一个新用户,它只会取消订阅任何待处理的请求,而是订阅下一个请求。

$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
    };
}
于 2014-07-18T03:47:42.740 回答