Don't release Zalgo!!!!! 同場加映Designing APIs for Asynchrony
最主要的一句話
make sure your function always sync or always async.
其實最近看書才知道這個詞,不過以前使用jQuery的時候就有設計過相似的概念。
function getData(url, model) {
var df = $.Deffered();
if(model.data) {
df.resolve(model.data)
} else async...
return df;
}
當時的想法也很簡單,我寫了一個getData function有時候直接可以取得,有時候需要非同步很麻煩,乾脆直接包起來就好了,這樣出去以後可以統一.then()多方便,寫著寫著就成習慣了。
最近買了小黃書才知道原來這是個好寫法(寫得好),當然其中還有很多原因,還包括了promise的一些特性,書裡面推崇的是es6的promise,jQuery版本的可能只有make sure your function always sync or always async這個概念。
等有空一點再來介紹。
PS.目前專案是與fetch寫在一起,但我總覺得哪裡還需要改進,譬如說不需要resolve(false),而是由component connect state去判斷是否有成功,對於async await還有try catch的部分還不熟,之後要多爬文囉。
// redux with thunk
(data, url) => (dispatch, getState) => (
new Promise((resolve) => {
if(data) {
dispatch('done');
resolve(true);
} else {
fetch().then(() => {
dispatch(doSomething()); //塞資料進入store
dispatch('done');
resolve(true);
}).catch((e) => {
dispatch('error');
resolve(false);
});
}
})
)