javascript - RxJS 在事件上发送多个唯一的 ajax 请求

标签 javascript ajax events rxjs reactive-extensions-js

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

相关文章:

c# - 如果浏览器关闭/上传取消,如何停止文件传输

javascript - 强制 <div></div> 到网页底部居中

jquery - 通过比较输入名称来更改输入 css

windows - 如何安排 Windows 任务在注销时运行

javascript - 如何访问使用 ajax 和 javascript 创建的输入元素数组并获取这些单独的值

javascript - 屏幕尺寸变化时的 Angular Bootstrap 范围

javascript - 如何在JS中使用行为委托(delegate)(OLOO)定义私有(private)变量?

java - JTable onchange 事件

javascript - Node.js 中的嵌套 for 循环与 Mocha 测试框架

php - AJAX/JQuery 和 PHP 无需重新加载联系表单即可发送提示