發表文章

目前顯示的是有「RxJS」標籤的文章

Story of Your Life

圖片
每周分享第 14 期 Story of Your Life 《語言本能》 本周閱讀 Steven Pinker 「語言與人性四部曲」的《 語言本能:探索人類語言進化的奧秘 》時,提到了「 沙皮爾-沃爾夫假說 」。 沙皮爾-沃爾夫假說(Sapir–Whorf hypothesis)是一個關於人類語言的假說,由語言學家兼人類學家 Edward Sapir 及其學生 Benjamin Whorf 所提出,是一門心理學及語言學的假說。這項學說認為,人類的思考模式受到其使用語言的影響,因而對同一事物時可能會有不同的看法。 S-W Hypothesis 還可以分為強弱兩種,分別是 Linguistic relativity(語言相對論)和 Linguistic determinism(語言決定論)。前者認為,不同語言在結構上的差異,對認知過程有所影響的。譬如一個人認為彩虹有幾種顏色,是由他的母語有那些基本顏色的詞彙來決定的。後者則認為語言極大程度地決定了一個人的世界觀。譬如愛斯基摩人對於雪的認識遠超於其它母語的人,因為他們對於不同狀態的雪(地上的雪、正飄下的雪、堆積的雪、雪堆)都有不同的名字,認為彼此是完全不一樣的東西。 青色在日語裡是代表藍色,但在說紅綠燈時卻是指綠燈,而不是藍燈。( 來源 ) 語言可以分為強未來時表述(如英語)和弱未來時表述(如中文)。 使用強未來時表述語言使人從認知上將現在和未來區分開來,使未來感覺起來更加遙遠。而使用弱未來時表述語言的人,認為現在和未來是連接相通的,而他們現在的行為會對未來產生更大的影響,於是他們會進行更多著眼於未來的事,例如儲蓄。 在我們博大精深的中文裡,如果你想稱呼一位男性長輩親戚,有伯父、叔叔、舅舅、姑丈、姨丈⋯⋯,而英文就一個詞「uncle」。中文讓我們對於家族...

如何使用 RxJS 處理分頁 API

這篇文章會以 node-github 的 getCommits API 為例,介紹如何使用 RxJS 取得所有分頁的 commits 結果。 前言 以往在處理分頁的 API,通常都會使用遞回運算,這會讓程式碼的可讀性不佳。有鑒於最近 RxJS 正夯,想說來試著寫寫看,於是就有了這篇分享文章。 需求 首先,因為 node-github 的 getCommits API 回傳的是一個 Promise 物件,所以需要先使用 RxJS 的 fromPromise 將它轉成 Observable: Rx.Observable .fromPromise(getCommits(...)) 接下來,利用 node-github 提供的 hasNextPage 和 getNextPage ,搭配 RxJS 的 expand 來處理分頁的遞回運算: Rx.Observable ... .expand( (response) => hasNextPage(response) ? Rx.Observable.fromPromise(getNextPage(response)) : Rx.Observable.empty() ); 上述邏輯大概是這樣: 如果 getCommits 回傳的結果還有下一頁,就繼續 call getNextPage API 如果已經沒有下一頁,則回傳 Observable.empty() 結束 expand 運算 最後,透過 reduce 將所有分頁回傳的結果 concat 成一個 Array: Rx.Observable ... ... .reduce( (acc, curr) => acc.concat(curr.data) , []); 整體程式碼大致如下: Rx.Observable .fromPromise(getCommits(...)) .expand( (response) => hasNextPage(response) ? Rx.Observable.fromPromis...

如何發送 redux-observable 的 catch error 至 Sentry

我們團隊目前使用 Sentry 這個服務作 error tracking,JavaScript 或 React 的基本安裝方法在 官方文件 都可以找到,這裡就不贅述。 同時我們也有在使用 redux-observable 這個 RxJS middleware 來處理帶有副作用的 Redux action。 根據 redux-observable 這篇 Error Handling 文件的介紹,一般處理 async 錯誤的寫法大概會是: import { createAction } from 'redux-actions'; import { Observable } from 'rxjs/Observable'; const fetchUserEpic = action$ => action$.ofType(FETCH_USER) .mergeMap(action => Observable.fromPromise(fetch(`/api/users/${action.payload}`)) .map(response => createAction('FETCH_USER_FULFILLED')(response)) .catch(error => Observable.of(createAction('FETCH_USER_REJECTED')(error.message))) ); 但是因為這裡並非正規的錯誤拋出方式,導致 Sentry 無法攔截到。 所以根據 Sentry 的這篇 Rich Error Reports with Redux Middleware 文件介紹,我們需要另外為它寫一個 Redux middleware 來處理。 策略是利用 redux-actions 的 Flux Standard Action 特性,將錯誤用 JavaScript 的 Error object 封裝至 action payload: ... .catch(error => Observable.of(createAction('FETCH_USER_RE...