溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js中怎么應用反應式編程

發(fā)布時間:2022-02-15 09:57:21 來源:億速云 閱讀:137 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“Node.js中怎么應用反應式編程”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Node.js中怎么應用反應式編程”吧!

Node.js中怎么應用反應式編程

反應式編程提供了先進的數(shù)據(jù)流,能夠以一種可預測的方式創(chuàng)建和操作事件流。

什么是反應式編程?

簡而言之,當輸入的變化導致輸出的相應變化,而不需要手動更新輸出的變化時,就可以說一個程序是反應式的。這使得軟件工程師可以繞過手動處理巨大實現(xiàn)的壓力。

功能性的反應式編程范式使我們的反應式代碼庫很容易被閱讀和理解,因為它減少了回調(diào)地獄,這使得異步的代碼塊難以閱讀。

由于反應式編程與異步操作有很大關系,函數(shù)式方法使我們更容易確定異步操作的結(jié)果。

反應式編程的基本原理

操作符

操作符是Observables嚴重依賴的方法。它們有以下使用情況。

  • 在處理異步請求時,將異步事件轉(zhuǎn)換為Observables

  • 將多個可觀察變量的序列組合成一個單一的可觀察變量

  • 錯誤處理

  • 處理基于時間的操作

可觀察操作符包括[filter(...)](https://rxjs.dev/api/operators/filter),[mergeMap(...)](https://rxjs.dev/api/operators/mergeMap),[of](https://rxjs.dev/api/index/function/of),[from](https://rxjs.dev/api/index/function/from),[concat](https://rxjs.dev/api/index/function/concat) 方法,等等。

可觀察流

一個Observable流是一個由多個輸入值組成的數(shù)組,它隨著時間的推移被處理。一個Observable流向它的訂閱者發(fā)出事件,而訂閱者又聽從這些事件進行進一步處理。可觀察的流可以被組合來創(chuàng)建新的流。數(shù)組方法,如map,reduce,filter ,等等,都是用來操作流的。

值可以按以下方式發(fā)射給訂閱者。

import { of, Observable } from "rxjs"; 
const emitter : Observable<string> = of("Sam", "Ray", "Thomas");

訂閱者

Observable訂閱器更像是數(shù)組迭代器。它們在產(chǎn)生的Observable流中循環(huán),使之有可能轉(zhuǎn)換或處理每個流。

下面的片段展示了如何訂閱一個Observable流。

emitter.subscribe((value: string) => {
  console.log(`Name: ${value}`)
})

反應式編程有一些內(nèi)置的訂閱方法,如emitflatMap map方法,這些方法允許我們監(jiān)聽Observable流的每個值,并根據(jù)我們的需要對它們進行處理。

反應式系統(tǒng)的標準

一個完全反應式的Node.js系統(tǒng)應該滿足以下標準。

響應式架構

一個反應式系統(tǒng)應該擁有良好的用戶體驗,對用戶的互動提供及時的響應。

彈性架構

彈性架構,如果正確實施,將允許系統(tǒng)響應錯誤而不破壞整個系統(tǒng)。

這種架構確保每個節(jié)點都有一個復制品。如果主節(jié)點發(fā)生故障,在其他可用的節(jié)點上會有某種回退。

可擴展性

系統(tǒng)應該能夠處理不同的負載,這與它的能力有關,當基礎設施需要很少或沒有資源時,它可以縮小規(guī)模,而當基礎設施需要更多資源時,它可以擴大規(guī)模,以便提供一個有效的成本管理策略。

此外,該系統(tǒng)也應該能夠處理時間點的負載。

為什么要考慮Node.js的反應式編程?

現(xiàn)在我們已經(jīng)簡要地討論了反應式編程的基本原理,了解考慮用Node.js進行編程的反應式方法的原因也很重要。

可擴展性

編寫功能性的反應式代碼可以更容易地管理代碼庫,提高項目的可擴展性。

功能實現(xiàn)

對于需要定期修改功能或增加新功能的項目來說,編寫功能性反應式代碼使得新功能更容易被添加到現(xiàn)有項目中。

與時間相關的錯綜復雜的問題

在對外部API進行異步請求時,我們確實會遇到一些時間限制的約束。這些限制可以用反應式編程方法有效地處理。

減少代碼的冗長性

實施反應式編程范式將極大地減少實現(xiàn)特定功能所需的代碼量。

引入?yún)f(xié)調(diào)和它的好處/權衡

在反應式編程誕生之前,用Node.js構建微服務需要協(xié)調(diào)所有服務互動的協(xié)調(diào)器模式。

協(xié)調(diào)器模式的一個典型用例是在電子商務應用中擁有微服務,這些微服務按順序處理以下任務:從購物車中獲取客戶訂單,計算總金額,生成賬單,在成功付款后,更新產(chǎn)品庫存并創(chuàng)建一個訂單ID,并向賣家提供Pending 。

雖然這提供了一個系統(tǒng)的方法來處理應用程序的邏輯流程,但依賴關系緊密耦合的一個主要缺點會破壞整個系統(tǒng)。例如,如果前面的服務出現(xiàn)故障,那么所有的依賴服務都不會被執(zhí)行。

在Node.js中何時使用反應式編程方法

反應式編程不是一個萬能的方法,但它在一些特定的情況下是非常合適的。

  • 當需要將應用流分散到可管理的微服務中時,反應式編程模式是非常合適的。

  • 當需要在有限的時間內(nèi)將應用交付給生產(chǎn)時

  • 當前面的一個依賴性的臨時關閉會導致整個系統(tǒng)的崩潰時

  • 當有很多異步的代碼塊,而等待的結(jié)果可能被延遲時,反應式編程也是非常合適的。

Node.js中的反應式編程的弊端

雖然功能化的反應式編程方法減少了協(xié)調(diào)器模式遇到的缺點,但它不能取代協(xié)調(diào)器模式,因為它有自己的缺點。

  • 分解應用流程并分布在所有服務中所產(chǎn)生的冗余代碼塊

  • 為了構建反應式服務,需要對流和事件循環(huán)有一個全面的了解

Node.js中流行的反應式編程庫

RxJS

這是JavaScript中最流行的反應式編程庫之一,被積極維護。

在寫這篇文章的時候,RxJS正在從v7過渡到v8,它在上周有超過2700萬次的下載。這次過渡的特點是重寫了庫的性能,更好的模塊化,更好的可調(diào)試的調(diào)用堆棧,以及向后的兼容性。

下面是一個快速的RxJS使用例子。

import { range } from "rxjs";
import { map, filter } from "rxjs/operators";

range(1, 200)
  .pipe(
    filter(result => result % 2 === 1),
    map(result => result * 2 )
  )
  .subscribe(result => console.log(result));

Reactor.js

Reactor.js是另一個用于反應式編程的JavaScript庫。雖然與Bacon.js和Rxjs相比,它還不是很流行,但它以輕量而聞名。使用Reactor.js在復雜的數(shù)據(jù)模型中保持一致性要容易得多,因為它能自動跟蹤反應式變量,并在任何反應式變量的值發(fā)生變化時重新觸發(fā)觀察者。
使用Reactor.js,不需要手動設置訂閱/監(jiān)聽器,因為依賴關系會自動為你設置。

下面是一個Reactor.js使用的快速例子。

const reactor = new Reactor({ name: "Doe" });

observe(() => {
  console.log("My name is ", reactor.name);
}); // prints "My name is Doe"

reactor.name = "John "; // prints "My name is John"

Reactor是基于與Bacon.js和Knockout.js相同的反應式原理。

其他用于反應式編程的JavaScript庫包括。

  • Flyd

  • Bacon.js

  • Knockout.js

  • Kefir

  • 大多數(shù)

到此,相信大家對“Node.js中怎么應用反應式編程”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI