ajax
應該不陌生,RxJS
的ajax
也符合我們過去的使用,這篇文章我們會先介紹使用GET
的兩種方式,當然,如果想了解如何使用POST
等其他用法,可以參考RxJS官網-ajax或下圖ajax(URL)
: 取得backend
回傳的資料,你可以進一步解析status
是否為200
,或者response
的JSON
資料...等。ajax.getJSON(URL)
:直接解析response
回傳的JSON
資料import { ajax } from 'rxjs/ajax';
import { map, catchError, of } from 'rxjs';
const URL = 'https://api.github.com/users?per_page=5';
// 測試1: 使用ajax(URL) 及 ajax.getJSON(URL)觀察取得資料的差異性
const obs$ = ajax(URL).pipe(
map((userResponse) => console.log('users: ', userResponse)),
);
obs$.subscribe({
next: (value) => console.log('===>next:', value),
error: (err) => console.log('===>error:', err),
});
import { ajax } from 'rxjs/ajax';
import { map, catchError, of } from 'rxjs';
const URL = 'https://api.github.com/users?per_page=5';
const URL404 = 'https://api.github.com/404';
// 測試2: 使用 URL 或 URL404測試 catchError並觀察
const obs$ = ajax
.getJSON(URL404) //<-- 呼叫URL 404
.pipe(map((userResponse) => console.log('users: ', userResponse)));
obs$.subscribe({
next: (value) => console.log('===>next:', value),
error: (err) => console.log('===>error:', err),
});
URL404
變數,來提供ajax.getJSON
呼叫URL404
是一個錯誤的網址,obs$.subscribe()
內的observer觀察者error
會被呼叫。import { ajax } from 'rxjs/ajax';
import { map, catchError, of } from 'rxjs';
const URL = 'https://api.github.com/users?per_page=5';
const URL404 = 'https://api.github.com/404';
// 測試2: 使用 URL 或 URL404測試 catchError並觀察
const obs$ = ajax.getJSON(URL404).pipe(
map((userResponse) => console.log('users: ', userResponse)),
// 加入catchError來捕捉 ajax GET過程的錯誤訊息
catchError((error) => {
console.log('catchError: ', error);
return of(error);
})
);
obs$.subscribe({
next: (value) => console.log('===>next:', value),
error: (err) => console.log('===>error:', err),
});
catchError
,也就是說~錯誤已經在pipe()
之中被攔截走了
錯誤已經在pipe()
之中被攔截走了,
錯誤已經在pipe()
之中被攔截走了,
因此,observer.next()
就會如正常的情況下被呼叫。
RxJS
的ajax
與過去使用ajax
的方法一樣。ajax(URL)
及ajax.getJSON(URL)
能夠讓我們快速執行GET
API。ajax
時,於pipe()
中搭配catchError
,能夠即時攔截error
,也因此最後會呼叫observer.next()
,若未加入catchError
,則會在最後呼叫observer.error()
喔耶 ~~~ 終於完賽啦!繼上一次的菜雞們,讓我們一起征服JS及React吧到現在已經過了兩年了,因工作的需求,我從React
被迫投向Angular
的懷抱,也因此認識了RxJS
這門技術,順勢成為了我這次參加鐵人賽的主題。
哼哼~一開始選這主題只能說我心臟有點大顆,過程中經常苦惱著該怎麼準備下一篇文章;沒想到一晃眼30天過去了,等等,RxJS
還有很多還沒說完學完呢! XD
當然,完賽,就是一種肯定,一種榮耀
我覺得自己又進步了一點點,信心也跟著多了一點點
超爽!你也這麼覺得,是吧!
RxJS
的學習心得分享給各位,各位也請持續的關注喔!!
請教一下小偉哥,
1.為什麽當狀態碼為404的情況時,ajax.getJSON和ajax的輸出結果是一致的呢?
2.演示代碼中的return of(error);為什麽要加上of,直接return error不行。
感谢!
Hi 蛋蛋騎兵
(1) 我上面有說明這兩者的差異,如下:
(2) 可以,不過對於RxJS來說,你如果想要串接另一個Observable,就得回傳一個Observable,你可以看一下我畫的流程圖。
你可以做個小實驗,直接回傳error,RxJS直接執行Observer的error後就結束了!