---
# System prepended metadata

title: Day22 【牙起來】 非同步事件 第一支訂閱 - RxJS

---

# Day22 【牙起來】 非同步事件 第一支訂閱 - RxJS

## 非同步事件

前端頁面的顯示總少不了後端的資料
要資料總會遇到網路問題，不是掉線就是延遲

在重要的資料還沒回來之前，前端頁面可以呈現 ex: **正在玩命加載中...** 等圖片或字樣
或者先展示現其他已經回來了的資料

又或者當重要的資料**卡住了**、正在**處理中**
前端可以等待處理完畢、收到資料的那一刻，再進行後續的動作
ex: 等我(前端)真的收到錢了，再寄出貨品給你


以上各種屬於『如果OO好了再通知我』、『XX還沒回來，我先做ABC』的一連串事件
因為不是同時進行處理的，所以稱為 **異步處理**、**非同步事件**

## RxJS

非同步處理方式有很多種
不同框架使用的寫法也都不盡相同

* `Javascript` 有`promise`、`async`、`await` 可以使用
* `jQuery`也有自己的Ajax `deferred`寫法
* `Angular`直接導入 [**RxJS**函式庫](https://rxjs.dev/) 來處理非同步事件，RxJS (Reactive Extensions)是用`Typescript`寫成的，是對網頁進行非同步事件的封裝


> 此舉導致要學`Angular`的人，從此多了一樣東西要學

而接下來的RxJS是 `Angular`的重頭戲



---

## 測試環境

為了模擬現實環境，我建立了兩個API
可點擊以下網址，或者透過 `Postman` 對以下網址發送 `GET` 方法請求

* 取得所有武器
https://63403667d1fcddf69cb402b7.mockapi.io/api/v1/weapons
* 取得所有防具
https://63403667d1fcddf69cb402b7.mockapi.io/api/v1/armors


![](https://i.imgur.com/gmLyTms.png)


接下來會透過 `http.get` 來訪問頁面取得資源


---


## 第一支RxJS

開啟一個新的`Angular`專案 `project03`
與前一次相同，透過ng cli新建一個`store`元件
    
    > ng g c store

修改`app.component.html`，把 `store` 元件放到畫面上顯示

```html=
<app-store></app-store>
```


修改`store.component.ts`，把`HttpClient`服務，注入進元件內，取名為`http`

```typescript=
...
import { HttpClient } from '@angular/common/http';
...

  constructor(private http: HttpClient) {
    let url = 'https://63403667d1fcddf69cb402b7.mockapi.io/api/v1/weapons';
    this.http.get(url).subscribe(result => {
      console.log(result);
    });
  }

...
```


接著**務必**在`app.module.ts`中新增這兩行
import HttpClient模組進專案內使用

![](https://i.imgur.com/gF9gD7j.png)


```typescript=
...

import { HttpClientModule } from '@angular/common/http';

...

@NgModule({
    
    ...
    
  imports: [
    BrowserModule,
    HttpClientModule
  ],
...

```

結果畫面
可以看到確實從網路上要到資源、印出來哩~

![](https://i.imgur.com/VD90Gtw.png)


> RxJS的第一天，進度13%