首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数反应编程(RX)中的合并性能

函数反应编程(RX)中的合并性能
EN

Stack Overflow用户
提问于 2015-09-07 19:50:28
回答 1查看 228关注 0票数 0

在以下代码中:

http://jsfiddle.net/staltz/4gGgs/27/

代码语言:javascript
复制
var clickStream = Rx.Observable.fromEvent(button, 'click');

var multiClickStream = clickStream
    .buffer(function() { return clickStream.throttle(250); })
    .map(function(list) { return list.length; })
    .filter(function(x) { return x > 1; });

// Same as above, but detects single clicks
var singleClickStream = clickStream
    .buffer(function() { return clickStream.throttle(250); })
    .map(function(list) { return list.length; })
    .filter(function(x) { return x === 1; });

// Listen to both streams and render the text label accordingly
singleClickStream.subscribe(function (event) {
    document.querySelector('h2').textContent = 'click';
});
multiClickStream.subscribe(function (numclicks) {
    document.querySelector('h2').textContent = ''+numclicks+'x click';
});
Rx.Observable.merge(singleClickStream, multiClickStream)
    .throttle(1000)
    .subscribe(function (suggestion) {
        document.querySelector('h2').textContent = '';
    });

clickStream序列在merge之后将被迭代多少次?我是说,看起来会是这样吗:

案例1

代码语言:javascript
复制
     for(numclicks : clickStream.length){
        if (numclicks === 1){ 
            document.querySelector('h2').textContent = 'click';
        }
     };
     for(numclicks : clickStream.length){
        if (numclicks > 1){ 
            document.querySelector('h2').textContent = ''+numclicks+'x click';
        }
     };

或者,它将在内部,真正合并成这样的东西(伪代码):

案例2

代码语言:javascript
复制
    for(numclicks: clickStream.length){
        if (numclicks === 1){ 
            document.querySelector('h2').textContent = 'click';
        }else if(numclicks > 1){
            document.querySelector('h2').textContent = ''+numclicks+'x click';
        }
     }

我个人认为,这种合并只是顺序地将流应用于其参数(案例1)。

我希望能有这样的标准。但如果没有-我对RxCpp和钠的实现特别感兴趣。我以js为例,因为它更具有交互性。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-08 04:10:09

fromEvent返回一个热源,因此所有订阅者都共享for循环的相同迭代。

忽略油门调用,其结果类似于:

代码语言:javascript
复制
for(numclicks: clickStream.length){

    // first subscription
    if (numclicks === 1){ 
        document.querySelector('h2').textContent = 'click';
    }

    // second subscription
    if(numclicks > 1){
        document.querySelector('h2').textContent = ''+numclicks+'x click';
    }

    // merged subscription
    if (numclicks === 0) {
        document.querySelector('h2').textContent = '';
    }
 }

油门调用意味着唯一单击流for循环的主体实际上只是将单击事件推入两个缓冲区,并在三个节气门操作符中每个重新设置计时器。当三个节气门计时器中的一个点火时,就会设置h2。由于定时器是不共享的,所以就像每个节流阀定时器的单独的for循环一样,每个循环将h2设置为三个可能的值中的一个:

这种行为在所有的Rx家族中都是相似的。

特别是在rxcpp方面:

rxcpp缺少缓冲区重载,该重载允许可观察到的缓冲区触发到新缓冲区的转换。rxcpp还没有实现节流。在默认情况下,rxcpp并不是线程安全的(付费),因此如果油门计时器使用引入线程,那么必须使用协调来显式地增加线程安全性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32445222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档