使用Javascript进行反应式编程

我在反应式编程方面有了新的东西,而且我可能会丢失所有这些我无法理解的文章。

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

我做的事

我始终使用promise,用于远程数据读取,本地asynchronousparsing等…更好的可testing性比callback,并符合我的需求。

我理解使用stream

除了特殊的情况外,我无法弄清楚在哪里可以解救我。

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

SocketIo的一个例子:

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

如果我没有错,我可以使用反应stream来处理这个案件,只需返回一个可观察的。 对 ?

我不明白

我正在学习Angular 2和所有的东西。 实际上,从许多博客,人们使用observables来获取远程数据,我不明白什么可能是使用它的优势,而不是承诺。

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

我需要的

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

在哪些情况下(其他情况下)比平时使用react native的东西更好?

@Günter给了你可观察的基础,特别是承诺的能力。

进一步说,我认为可观察的关键优势是能够使用运算符来构buildasynchronous数据stream/stream。

以下是一些具体的用例:

  • switchMap / switchMap 。 当您想要利用表单input来根据相应的HTTP请求过滤列表时,您需要用于请求的值是用户完成写入时的值。 没有必要发送几个请求:每个新字符(一个是's',一个是'so',一个是'som',…,一个是'要search的东西')。 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 ,则每个input都会有一个请求,但之前的进行中请求将被取消。 这可以让你得到正确的结果,特别是如果一些请求的请求执行时间更长。

    在这种情况下,可以将事件从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); } 

我认为这是可观察性的真正威力:asynchronous处理链/数据stream,并根据事件链接应用程序的不同部分。 这是承诺不能做的事情,并允许实现用例,使您的应用程序更健壮。

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

基本上,如果你有一个单独的asynchronous事件,你不会得到有关(callback)通知你使用Promise 。 如果您期望一系列事件使用Observable

Observable超过Promise优势

  • Observable可以被取消
  • 可观察的是懒惰的(在订阅之前不要做任何事情)
  • Observable可以做Promise可以做的事情,但是只有使用Observable才能让你用相同的方式进行编码(使用rx运算符而不是.then()不pipe你是期待一个还是一系列的事件。