2016-03-14 76 views
5

我是反应式编程的新手,我有点遗失阅读所有这些我无法理解的文章。使用Javascript进行反应式编程

其实,我是一个来自Nodejs,Angularjs,Angular 2和React的javascript开发人员。

我做什么

我用诺言所有的时间,进行远程数据抓取,本地异步分辨率等等更好的可测试性比回调和适合我的需要。

我明白使用流

我想不通的地方流能救我,除了在特定情况下是什么。

这种特殊情况是,我不能在听流时使用承诺,因为承诺只能解决一次。

与SocketIo一个例子:

io.on('connection', (socket) => { 
    // this works 
}); 

io.on('connection').then((socket) => { 
    // this can't work, promise would be resolved only once 
}); 

如果我不是错了,我可以用反应流通过返回一个可观察来管理这种情况。对 ?

我不明白

我米左右学习角2和所有的东西。实际上,从许多博客中,人们使用observables来获取远程数据,我无法理解使用它而不是承诺的优势。

事实是,我需要在这两种情况下制造一个遥控器,为什么比另一个更多?这是一个性能问题?

我需要

如果您已经阅读了全部问题,我需要的是要了解什么是使用远程数据获取的情况下反应式编程,而不是承诺的优势是什么?

在哪个(其他情况下)使用反应性的东西比平常的东西更好?

+0

阅读这个问题,将澄清很多https://开头的github .com/angular/angular/issues/5876 –

回答

3

基本上,如果你有一个单独的异步事件你不想得到关于(回调)通知你使用Promise。如果你期望的一系列事件使用的ObservableObservable

优势超过Promise

  • 可观察可以取消
  • 可观察懒
  • 可观察可以(被订阅之前没有做任何事情)做什么Promise可以但只有使用Observable允许您以相同的方式编码(使用rx运算符而不是.then(),无论您是否期望发生一个或一系列事件)
+0

嗨!我知道这是一个古老的答案,但我可能不清楚的一件事。可观察者能为后来的用户保留一个返回值,类似于已经解决的承诺将如何立即“.then()'d?另外,你是否可以拥有多个观察者的订阅者而不影响其操作(例如,使其异步调用两次)如果你认为值得自己的问题,我可以这样做。 – Katana314

+0

'BehaviorSubject'创建一个'Observable',它将最后一个值立即返回给新的订阅者。 '.share()'操作符创建一个'Observable'多播,每个事件都传递给每个用户。注意 - 你需要显式地导入运算符(比如'map','share',...)。 –

6

@Günter给你的观察者的基础,特别是承诺的能力被称为。为了更进一步,我认为observables的关键优势在于能够使用运算符构建异步数据流/流。

下面是一些具体的使用情况:

  • debounceTime/switchMap。当您想要利用表单输入来根据相应的HTTP请求筛选列表时,您需要用于请求的值是用户完成写入时的值。没有必要发送几个请求:每个新字符(一个用于's',一个用于'so',一个用于'som',...,一个用于'搜索的东西')。 debounceTime运营商通过缓冲事件并在不活动时间后提供最后一个来允许这种情况。

    这里有一个例子:

    @Component({ 
        (...) 
        template: ` 
        <input [ngFormControl]="ctrl"/> 
        ` 
    }) 
    export class MyComponent { 
        constructor() { 
        this.ctrl = new Control(); 
        this.ctrl.valueChanges 
           .debounceTime(500) 
           .distinctUntilChanged() 
           .switchMap((vallue: string) => { 
           // Get data according to the filled value 
           return this.service.getData(entry); 
           }) 
           .subscribe(data => { 
           // Update the linked list 
           this.list = data; 
           }); 
        } 
    } 
    

    如果你只使用switchMap,你将有每输入,但以前正在进行的请求将被取消一个请求。这允许您获得正确的结果,尤其是对于某些请求的请求执行时间更长的情况。

    在这种情况下,您可以将事件从Web UI(DOM事件)链接到HTTP请求以相应执行(对事件作出反应)并应用一些高级行为。

  • 执行重试。通过混合retryWhendelaytimeout运营商,你可以很容易地(且透明)实施重试

    searchPlaces(searchText:string) { 
        var params = new URLSearchParams(); 
        params.set('placename_startsWith', searchText); 
        params.set('username', 'templth'); 
    
        return this.http.get('http://api.geonames.org/postalCodeSearchJSON', 
         { search: params }) 
        .retryWhen(error => error.delay(500)) 
        .timeout(2000, return new Error('delay exceeded')) 
        .map(res => res.json().postalCodes); 
    } 
    

我认为这是可观察的实际功率:异步处理链/数据流和连接不同的部分基于事件的应用程序。这是承诺不能完成的事情,并且允许实现用例来使应用程序更健壮。

这是一系列的文章,可以给你更多的细节: