ãã®èšäºã§ã¯ãåªããã³ãŒãã®äœæãšçºçããåé¡ã«ã€ããŠèª¬æããŸãã æç¢ºã宣èšçãæ§æå¯èœãããã³ãã¹ãå¯èœ-ãããã®çšèªã¯ãé©åãªã³ãŒããèšè¿°ããéã«äœ¿çšãããŸãã åé¡è§£æ±ºã¯ããã°ãã°çŽç²é¢æ°ãšåŒã°ããŸãã ããããWebã¢ããªã±ãŒã·ã§ã³ãäœæããäž»ãªçç±ã¯ãå¯äœçšãšè€éãªéåæã¯ãŒã¯ãããŒã§ãããæ¬è³ªçã«ã¯ã¯ãªãŒã³ã§ã¯ãããŸããã 以äžã§ã¯ãçŽç²ãªæ©èœã®å©ç¹ãç¶æããªãããå¯äœçšãè€éãªéåæã¹ã¬ããã®åŠçãã«ããŒã§ããã¢ãããŒãã«ã€ããŠèª¬æããŸãã
è¯ãã³ãŒããæžã
çŽç²ãªæ©èœã¯ãåªããã³ãŒããæžãããšã®èæ¯ã§ãã çŽç²ãªé¢æ°ãšã¯ãåãåŒæ°ã§åžžã«åãå€ãè¿ããç®ã«èŠããå¯äœçšããªã颿°ã§ãã
function add(numA, numB) { return numA + numB }
çŽç²ãªé¢æ°ã®äŸ¿å©ãªæ©èœã¯ããã¹ãããããããšã§ãã
test.equals(add(2, 2), 4)
æ§æå¯èœæ§ããã®åŒ·ã¿ã§ãã
test.equals(multiply(add(4, 4), 2), 16)
ããã«ã宣èšçã«éåžžã«ç°¡åã«äœ¿çšã§ããŸãã
const totalPoints = users .map(takePoints) .reduce(sum, 0)
ããããã¢ããªã±ãŒã·ã§ã³ãèŠãŠã¿ãŸãããã çŽç²ãªé¢æ°ã§å®éã«è¡šçŸã§ããã®ã¯ã©ã®éšåã§ããïŒ äŒçµ±çã«çŽç²ãªæ©èœãå®è¡ããå€ã倿ããé »åºŠã¯ã©ããããã§ããïŒ ç§ã¯ããªãã®ã³ãŒãã®ã»ãšãã©ãå¯äœçšã§åäœãããšä»®å®ããããšãã§ããŸãã ãããã¯ãŒã¯èŠæ±ãDOMæäœãWebãœã±ããã®äœ¿çšãããŒã«ã«ã¹ãã¬ãŒãžã®å®è¡ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ã®å€æŽãªã©ãè¡ããŸãã ããã¯ãã¹ãŠãå°ãªããšãã€ã³ã¿ãŒãããäžã§ã®ã¢ããªã±ãŒã·ã§ã³éçºã«ã€ããŠèª¬æããŠããŸãã
å¯äœçš
ååãšããŠãåæ§ã®å Žåã®å¯äœçšã«ã€ããŠè©±ããŸãïŒ
function getUsers() { return axios.get('/users') .then(response => ({users: response.data})) }
getUsers
颿°ã¯ããããèªäœã®å€åŽãã®äœãgetUsers
æããŸãã ããã¯ãµãŒããŒã®å¿çã§ãããããæ»ãå€ã¯åžžã«äžèŽãããšã¯éããŸããã ãã ãããã®é¢æ°ã宣èšçã«äœ¿çšããŠãããŸããŸãªãã§ãŒã³ã§æ§æããããšãã§ããŸãã
doSomething() .then(getUsers) .then(doSomethingElse)
ãã ãã axiosã¯å¶åŸ¡ã§ããªãããããã¹ãã¯å°é£ã§ãã axios
ãåŒæ°ãšããŠåãããã«é¢æ°ãæžãçŽããŸãã
function getUsers(axios) { return axios.get('/users') .then(response => ({users: response.data})) }
ãã¹ããç°¡åã«ãªããŸããïŒ
const users = ['userA', 'userB'] const axiosMock = Promise.resolve({data: users}) getUsers(axiosMock).then(result => { assert.deepEqual(result, {users: users}) })
ãã ãã axiosãå
¥åã«æç€ºçã«æž¡ãå¿
èŠãããããã颿°ãç°ãªããã§ãŒã³ã«ãªã³ã¯ããéã«åé¡ãçºçããŸãã
doSomething()
å¯äœçšã§æ©èœããæ©èœã«ã¯å®éã«åé¡ããããŸãã
Elm ã Cycle ã redux-reduxå®è£
ãªã©ã®ãããžã§ã¯ãã§äººæ°ã®ããã¢ããã€ã¹ïŒãã¢ããªã±ãŒã·ã§ã³ã®ç«¯ã«å¯äœçšãããã·ã¥ããŸããã ããã¯åºæ¬çã«ãã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ãã¯ãªãŒã³ã«ä¿ãããããšãæå³ããŸãã å¯äœçšãåŒãèµ·ããå¿
èŠããããšãã¯ãã€ã§ãããããåããã¹ãã§ãã ãã®ã¢ãããŒãã®åé¡ã¯ãããããèªã¿ãããã®æ¹åã«åœ¹ç«ããªãããšã§ãã å
šäœçã«è€éãªã¯ãŒã¯ãããŒã衚çŸããããšã¯ã§ããŸããã ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãå¥ã®å¯äœçšãªã©ãåŒãèµ·ããå¯èœæ§ã®ãããããå¯äœçšã®é¢ä¿ãé ãè€æ°ã®ç¡é¢ä¿ãªã«ãŒãããããŸãã ããã¯åçŽãªã¢ããªã±ãŒã·ã§ã³ã§ã¯åé¡ã«ãªããŸãããè€æ°ã®è¿œå ã«ãŒããæ±ãããšã¯ãã£ãã«ãªãããã§ãã ããããå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãæçµçã«å€æ°ã®ãµã€ã¯ã«ãçºçããããããçžäºã«ã©ã®ããã«é¢ä¿ããŠããããçè§£ããããšã¯å°é£ã§ãã
ããã«ã€ããŠãäŸãæããŠè©³ãã説æããŸãã
å
žåçãªã¢ããªã±ãŒã·ã§ã³ã¹ããªãŒã
ã¢ããªã±ãŒã·ã§ã³ããããšããŸãããã éå§æã«ããŠãŒã¶ãŒæ
å ±ãååŸããŠããŠãŒã¶ãŒããã°ã€ã³ããŠãããã©ããã確èªããŸãã æ¬¡ã«ãã¿ã¹ã¯ã®ãªã¹ããååŸããŸãã ãããã¯ä»ã®ãŠãŒã¶ãŒã«é¢é£ä»ããããŠããŸãã ãããã£ãŠãåä¿¡ããã¿ã¹ã¯ã®ãªã¹ãã«åºã¥ããŠããããã®ãŠãŒã¶ãŒã«é¢ããæ
å ±ãåçã«ååŸããå¿
èŠããããŸãã ãã®ã¯ãŒã¯ãããŒãããããããã宣èšçã§ãæ§æå¯èœã§ããã¹ãå¯èœãªæ¹æ³ã§èšè¿°ããããã«äœãããŸããïŒ
reduxã䜿çšããç°¡åãªå®è£
ãèŠãŠã¿ãŸãããã
function loadData() { return (dispatch, getState) => { dispatch({ type: AUTHENTICATING }) axios.get('/user') .then((response) => { if (response.data) { dispatch({ type: AUTHENTICATION_SUCCESS, user: response.data }) dispatch({ type: ASSIGNMENTS_LOADING }) return axios.get('/assignments') .then((response) => { dispatch({ type: ASSIGNMENTS_LOADED_SUCCESS, assignments: response.data }) const missingUsers = response.data.reduce((currentMissingUsers, assignment) => { if (!getState().users[assigment.userId]) { return currentMissingUsers.concat(assignment.userId) } return currentMissingUsers }, []) dispatch({ type: USERS_LOADING, users: users }) return Promise.all( missingUsers.map((userId) => { return axios.get('/users/' + userId) }) ) .then((responses) => { const users = responses.map(response => response.data) dispatch({ type: USERS_LOADED, users: users }) }) }) .catch((error) => { dispatch({ type: ASSIGNMENTS_LOADED_ERROR, error: error.response.data }) }) } else { dispatch({ type: AUTHENTICATION_ERROR }) } }) .catch(() => { dispatch({ type: LOAD_DATA_ERROR }) }) } }
ããã§ã¯ãã¹ãŠãééã£ãŠããŸãã ãã®ã³ãŒãã¯ãçè§£ã§ããã宣èšçã§ãªããçè§£ã§ããããã¹ãã§ããŸããã ãã ãã1ã€ã®å©ç¹ããããŸãã loadData颿°ãåŒã³åºããããšãã«çºçãããã¹ãŠã®ããšã¯ãå®è¡æã«ãèŠåæ£ããæ¹æ³ã§1ã€ã®ãã¡ã€ã«ã§å®çŸ©ãããŸãã
ãã¢ããªã±ãŒã·ã§ã³ã®ç«¯ã§ãå¯äœçšãåé¢ãããšãã¹ããªãŒã ã®äžéšã®ãã¢ã®ããã«èŠããŸãã
function loadData() { return (dispatch, getState) => { dispatch({ type: AUTHENTICATING_LOAD_DATA }) } } function loadDataAuthenticated() { return (dispatch, getState) { axios.get('/user') .then((response) => { if (response.data) { dispatch({ type: AUTHENTICATION_SUCCESS, user: response.data }) } else { dispatch({ type: AUTHENTICATION_ERROR }) } }) } } function getAssignments() { return (dispatch, getState) { dispatch({ type: ASSIGNMENTS_LOADING }) axios.get('/assignments') .then((response) => { dispatch({ type: ASSIGNMENTS_LOADED_SUCCESS, assignments: response.data }) }) .catch((error) => { dispatch({ type: ASSIGNMENTS_LOADED_ERROR, error: error.response.data }) }) } }
åéšåã¯ãåã®äŸãããèªã¿ããããªã£ãŠããŸãã ãããŠããããã¯ä»ã®ãã§ãŒã³ã«å
¥ããã®ãç°¡åã§ãã ãã ããæçåãåé¡ã«ãªããŸãã ãããã®éšåãäºãã«ã©ã®ããã«é¢é£ããŠããããçè§£ããããšã¯å°é£ã§ãããªããªããã©ã®é¢æ°ãå¥ã®é¢æ°ã®åŒã³åºãã«ã€ãªããããèŠãããšãã§ããªãããã§ãã ãã¡ã€ã«éãç§»åããŠãããã¢ã¯ã·ã§ã³ããã£ã¹ããããããšå¯äœçšãçºçããå¥ã®å¯äœçšãçæããæ°ããã¢ã¯ã·ã§ã³ãéä¿¡ããæ¹æ³ãé ã«åäœæããããšãäœåãªããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ç«¯ã«å¯äœçšãããããããšã«ãããããªãã¯æ¬åœã«å©ç¹ãåŸãããšãã§ããŸãã ãã ãããã€ãã¹ã®å¹æããããŸãããããŒã«ã€ããŠè©±ãã®ãé£ãããªããŸãã ãã¡ãããããã«ã€ããŠè°è«ããããšã¯ã§ããŸããããã¹ãã§ãã äžèšã®äŸãšæšè«ãéããŠãç§ã®èŠè§£ãäŒããããšãã§ãããšæããŸãã
宣èšãžã®é
ãã®ã¹ããªãŒã ãæ¬¡ã®ããã«èšè¿°ã§ãããšæ³åããŠãã ããã
[ dispatch(AUTHENTICATING), authenticateUser, { error: [ dispatch(AUTHENTICATED_ERROR) ], success: [ dispatch(AUTHENTICATED_SUCCESS), dispatch(ASSIGNMENTS_LOADING), getAssignments, { error: [ dispatch(ASSIGNMENTS_LOADED_ERROR) ], success: [ dispatch(ASSIGNMENTS_LOADED_SUCCESS), dispatch(MISSING_USERS_LOADING), getMissingUsers, { error: [ dispatch(MISSING_USERS_LOADED_ERROR) ], success: [ dispatch(MISSING_USERS_LOADED_SUCCESS) ] } ] } ] } ]
ããã¯æå¹ãªã³ãŒãã§ããããšã«æ³šæããŠãã ãããããã«ã€ããŠã¯ã詳现ã«åæããŸãã ãŸããããã§ã¯éæ³ã®APIã䜿çšããŠããŸããããããã¯åãªãé
åããªããžã§ã¯ãã颿°ã§ãã ãããæãéèŠãªã®ã¯ã宣èšåœ¢åŒã®ã³ãŒããæå€§éã«æŽ»çšããŠãè€éãªã¢ããªã±ãŒã·ã§ã³ã¹ããªãŒã ã®äžè²«ããèªã¿ãããèšè¿°ãäœæããããšã§ãã
æ©èœããªãŒ
颿°ããªãŒãå®çŸ©ïŒå®£èšïŒããŸããã åè¿°ããããã«ãç¹å¥ãªAPIã䜿çšããŠå®çŸ©ããŸããã§ããã ãããã¯ã颿°ããªãŒå
ã®ããªãŒ...ã§å®çŸ©ããã颿°ã§ãã ããã§äœ¿çšããã颿°ã¯ãã¹ãŠã颿°ãã¡ã¯ããªãŒïŒãã£ã¹ãããïŒãšåæ§ã«ãä»ã®ããªãŒå®çŸ©ã§åå©çšã§ããŸãã ããã¯æ§æã®åçŽãã瀺ããŠããŸãã å颿°ãä»ã®ããªãŒã§æ§æãããã ãã§ã¯ãããŸããã ä»ã®ããªãŒã«ããªãŒå
šäœãå«ããããšãã§ããŸããããã«ãããæ§æã®é¢ã§ç¹ã«è峿·±ããã®ã«ãªããŸãã
[ dispatch(AUTHENTICATING), authenticateUser, { error: [ dispatch(AUTHENTICATED_ERROR) ], success: [ dispatch(AUTHENTICATED_SUCCESS), ...getAssignments ] } ]
ãã®äŸã§ã¯ãé
åã§ãããæ°ããgetAssignmentsããªãŒãäœæããŸããã spreadæŒç®åã䜿çšããŠã1ã€ã®ããªãŒãå¥ã®ããªãŒã«æ§æã§ããŸãã
testabilityã«é²ãåã«ã颿°ããªãŒãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã å®è¡ããŸãããïŒ
颿°ããªãŒã®å®è¡
ããªãŒé¢æ°ã®å®è¡æ¹æ³ã®å§çž®äŸã¯æ¬¡ã®ãšããã§ãã
import FunctionTree from 'function-tree' const execute = new FunctionTree() function foo() {} execute([ foo ])
äœæãããFunctionTreeã€ã³ã¹ã¿ã³ã¹ã¯ãããªãŒãå®è¡ã§ãã颿°ã§ãã äžèšã®äŸã§ã¯ã foo颿°ãå®è¡ãããŸãã ããã«é¢æ°ã远å ãããšããããã¯é çªã«å®è¡ãããŸãã
function foo() {
éåææ§
function-tree
ã¯promiseã§function-tree
ã 颿°ãpromiseãè¿ãå ŽåããŸãã¯async
ã䜿çšããŠé¢æ°ãéåæãšããŠå®çŸ©ãããšãexecute颿°ã¯promiseãæºããããïŒè§£æ±ºããïŒãŸãã¯æåŠããããŸã§ïŒå
ã«é²ãåã«ïŒåŸ
æ©ããŸãã
function foo() { return new Promise(resolve => { setTimeout(resolve, 1000) }) } function bar() {
å€ãã®å Žåãéåæã³ãŒãã¯ãã倿§ãªçµæããããããŸãã ãããã®çµæã宣èšçã«å®çŸ©ããæ¹æ³ãçè§£ããããã«ã颿°ããªãŒã®ã³ã³ããã¹ãã調ã¹ãŸã ã
ã³ã³ããã¹ã
颿°function-tree
ã䜿çšããŠå®è¡ããããã¹ãŠã®é¢æ°ã¯ã1ã€ã®åŒæ°ãåããŸãã ã³ã³ããã¹ãã¯ãããªãŒã§å®çŸ©ããã颿°ãæ©èœããå¯äžã®åŒæ°ã§ãã ããã©ã«ãã§ã¯ãã³ã³ããã¹ãã«ã¯inputãšpathã® 2ã€ã®ããããã£ããããŸã ã
å
¥åããããã£ã«ã¯ãããªãŒã®éå§æã«æž¡ããããã€ããŒããå«ãŸããŸãã
颿°ãæ°ãããã€ããŒããããªãŒã®äžã«è»¢éããå ŽåãçŸåšã®ãã€ããŒããšããŒãžããããªããžã§ã¯ããè¿ãå¿
èŠããããŸãã
function foo({input}) { input.foo
åæé¢æ°ãéåæãã¯åé¡ã§ã¯ãªãããªããžã§ã¯ããŸãã¯ãªããžã§ã¯ãã§äœæããããããã¹ãè¿ãã ãã§ãã
å®è¡çšã®ãã¹ãéžæããã¡ã«ããºã ã®ç ç©¶ã«ç§»ããŸãããã
æ¹æ³
颿°ããè¿ãããçµæã«ãããããªãŒå
ã®ãããªãå®è¡ãã¹ã決å®ã§ããŸãã éçåæã®ãããã§ãã³ã³ããã¹ããã¹ããããã£ã¯ãã©ã®ãã¹ãå®è¡ãç¶ç¶ã§ãããããã§ã«ç¥ã£ãŠããŸãã ããã¯ãããªãŒã§å®çŸ©ãããŠããå®è¡ãã¹ã®ã¿ã䜿çšå¯èœã§ããããšãæå³ããŸãã
function foo({path}) { return path.pathA() } function bar() {
ãªããžã§ã¯ããpathã¡ãœããã«æž¡ãããšã«ããããã€ããŒããæž¡ãããšãã§ããŸãã
function foo({path}) { return path.pathA({foo: 'foo'}) } function bar({input}) { console.log(input.foo)
ãã¹ã®ã¡ã«ããºã ã¯äœã«é©ããŠããŸããïŒ ãŸã第äžã«ãããã¯æ¬è³ªçã«å®£èšçã§ãã ifãŸãã¯switchã¹ããŒãã¡ã³ãã¯ãããŸããã ããã«ãããèªã¿ããããåäžããŸãã
ããã«éèŠãªã®ã¯ããã¹ãã¹ããŒãšã©ãŒãåŠçããªãããšã§ãã å€ãã®å Žåãã¹ããªãŒã ã¯ããšã©ãŒãçºçããå Žåããããå®è¡ããããã¹ãŠãã¹ããŒããããšèããããŸãã ããããWebã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯ããã§ã¯ãããŸããã ããŸããŸãªçµè·¯ããã©ãçç±ã¯ãããããããŸãã ãœãªã¥ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã®åœ¹å²ããµãŒããŒããè¿ãããå¿çãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãæž¡ãããå€ãªã©ã«åºã¥ããŠããå ŽåããããŸãã å®éã function-tree
ã¯ãšã©ãŒããã£ããããããšã©ãŒãèµ·ããããåæ§ã®ææ³ãç»å ŽããŸãã 颿°ãå®è¡ããã ãã§ãå®è¡ãåå²ãããã¹ãè¿ãããšãã§ããŸãã
ããã€ãã®å°ããªé ãããæ©èœããããŸãã ããšãã°ãäœãå®è£
ããã«é¢æ°ããªãŒãå®çŸ©ã§ããŸãã ããã¯ãå¯èœãªãã¹ãŠã®å®è¡ãã¹ãäºåå®çŸ©ãããŠããããšãæå³ããŸãã ã©ã®ã±ãŒã¹ãåŠçããå¿
èŠãããããèããããŸãã ãŸããçºçããå¯èœæ§ã®ããã·ããªãªãç¡èŠãããå¿ãããããå¯èœæ§ã倧å¹
ã«æžãããŸãã
ãããã€ããŒ
å
¥åãšãã¹ã®ã¿ã§ã¯ãè€éãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããã ãããã£ãŠã function-tree
ãããã€ããŒã®æŠå¿µã«åºã¥ããŠæ§ç¯ãããŸã ã å®éã input
ãšpath
ããããã€ããŒã§ãã function-tree
ã¯ãããã€ãã®æ¢è£œã®ãã®ãå«ãŸããŠããŸãã ãããŠãã¡ãããèªåã§äœæããããšãã§ããŸãã Reduxã䜿çšãããšããŸãã
import FunctionTree from 'function-tree' import ReduxProvider from 'function-tree/providers/Redux' import store from './store' const execute = new FunctionTree([ ReduxProvider(store) ]) export default execute
ããã§ã颿°ã®dispatchããã³getStateã¡ãœããã«ã¢ã¯ã»ã¹ã§ããŸãã
function doSomething({dispatch, getState}) { dispatch({ type: SOME_CONSTANT }) getState()
ContextProviderã䜿çšããŠä»ã®ããŒã«ã远å ã§ããŸãã
import FunctionTree from 'function-tree' import ReduxProvider from 'function-tree/providers/Redux' import ContextProvider from 'function-tree/providers/Context' import axios from 'axios' import store from './store' const execute = new FunctionTree([ ReduxProvider(store), ContextProvider({ axios }) ]) export default execute
ã»ãšãã©ã®å Žåã DebuggerProviderã䜿çšããŸãã Google Chromeã®æ¡åŒµæ©èœãšçµã¿åãããŠãçŸåšã®äœæ¥ããããã°ã§ããŸãã äžèšã®äŸã«ãããã¬ãŒãããã€ããŒã远å ããŸãã
import FunctionTree from 'function-tree' import DebuggerProvider from 'function-tree/providers/Debugger' import ReduxProvider from 'function-tree/providers/Redux' import ContextProvider from 'function-tree/providers/Context' import axios from 'axios' import store from './store' const execute = new FunctionTree([ DebuggerProvider(), ReduxProvider(store), ContextProvider({ axios }) ]) export default execute
ããã«ããããããã®ããªãŒãã¢ããªã±ãŒã·ã§ã³ã§å®è¡ããããšãã«çºçãããã¹ãŠã確èªã§ããŸãã ãããã¬ãŒãããã€ããŒã¯ãã³ã³ããã¹ãã«é
眮ãããã¹ãŠãèªåçã«ã©ããããŠè¿œè·¡ããŸãã

ãµãŒããŒåŽã§function-tree
ã䜿çšããããšã«ããå Žåã NodeDebuggerProviderãæ¥ç¶ã§ããŸãã

ãã¹ã¿ããªãã£
ããããæãå¯èœæ§ãé«ãã®ã¯ãæ©èœããªãŒããã§ãã¯ããæ©èœã§ãã çµå±ã®ãšãããããã¯éåžžã«ç°¡åã§ãã ããªãŒå
ã®åã
ã®é¢æ°ããã¹ãããã«ã¯ãç¹å¥ã«æºåãããã³ã³ããã¹ãã§ããããåŒã³åºãã ãã§ãã å¯äœçšæ©èœã®ãã¹ããæ€èšããŠãã ããã
function setData({window, input}) { window.app.data = input.result }
const context = { input: {result: 'foo'}, window: { app: {}} } setData(context) test.deepEqual(context.window, {app: {data: 'foo'}})
éåæé¢æ°ã®ãã¹ã
å€ãã®ãã¹ãã©ã€ãã©ãªã§ã¯ãã°ããŒãã«ãªäŸåé¢ä¿ã®ã¹ã¿ããäœæã§ããŸãã ãã ãã function-tree
ã¯ã³ã³ããã¹ãåŒæ°ã§äœ¿çšå¯èœãªãã®ã®ã¿ã䜿çšããããã function-tree
ã§ãããè¡ãçç±ã¯ãããŸããã ããšãã°ã axiosã䜿çšããŠããŒã¿ãååŸããæ¬¡ã®é¢æ°ã¯ã次ã®ããã«ãã¹ãã§ããŸãã
function getData({axios, path}) { return axios.get('/data') .then(response => path.success({data: response.data})) .catch(error => path.error({error: error.response.data})) }
const context = { axios: { get: Promise.resolve({ data: {foo: 'bar'} }) } } getData(context) .then((result) => { test.equal(result.path, 'success') test.deepEqual(result.payload, {data: {foo: 'bar'}}) })
ããªãŒå
šäœã®ãã¹ã
ããã§ã¯ããã«è峿·±ããã®ã«ãªããŸãã 颿°ãåå¥ã«ãã¹ãããã®ãšåãæ¹æ³ã§ãããªãŒå
šäœããã¹ãã§ããŸãã
åçŽãªããªãŒãæ³åããŠã¿ãŸãããã
[ getData, { success: [ setData ], error: [ setError ] } ]
ãããã®é¢æ°ã¯ã axios
ã䜿çšããŠããŒã¿ãååŸãã window
ãªããžã§ã¯ãã®ããããã£ã«ä¿åããŸãã ã³ã³ããã¹ãã«æž¡ãã¹ã¿ããæã€æ°ããã©ã³ã¿ã€ã 颿°ãäœæããŠãããªãŒããã¹ãããŸãã æ¬¡ã«ãããªãŒãéå§ããå®äºåŸã«å€æŽã確èªããŸãã
const FunctionTree = require('function-tree') const ContextProvider = require('function-tree/providers/Context') const loadData = require('../src/trees/loadData') const context = { window: {app: {}}, axios: { get: Promise.resolve({data: {foo: 'bar'}}) } } const execute = new FunctionTree([ ContextProvider(context) ]) execute(loadData, () => { test.deepEquals(context.window, {app: {data: 'foo'}}) })
ã©ã®ã©ã€ãã©ãªã䜿çšããŠãããŸããŸããã ã©ã€ãã©ãªãããªãŒã³ã³ããã¹ãã«é
眮ããªããã颿°ããªãŒãç°¡åã«ãã¹ãã§ããŸãã
å·¥å Ž
ããªãŒã¯æ©èœããŠãããããéçºãé«éåãããã¡ã¯ããªãäœæã§ããŸãã Reduxã®äŸã§ã ãã£ã¹ããããã¡ã¯ããªã®äœ¿çšãèŠãŠããŸããã æ¬¡ã®ããã«å®£èšãããŸããã
function dispatchFactory(type) { function dispatchFunction({input, dispatch}) { dispatch({ type, payload: input }) }
ã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã¯ããªãäœæããŠããã¹ãŠã®ç¹å®ã®é¢æ°ãäœæããªãããã«ããŸãã åäžã®ç¶æ
ããªãŒã§ããbaobabã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãä¿åãããšããŸãã
function setFactory(path, value) { function set({baobab}) { baobab.set(path.split('.'), value) } return set } export default set
ãã®ãã¡ã¯ããªã䜿çšãããšãããªãŒã§ç¶æ
ã®å€æŽãçŽæ¥è¡šçŸã§ããŸãã
[ set('foo', 'bar'), set('admin.isLoading', true) ]
ãã¡ã¯ããªã䜿çšã㊠ãã¢ããªã±ãŒã·ã§ã³çšã«ç¬èªã®DSLãæ§ç¯ã§ããŸãã äžéšã®å·¥å Žã¯éåžžã«äžè¬åãããŠãããããããããfunction-tree
äžéšã«ããããšã«ããŸããã
debounce
debounce
ãã¡ã¯ããªã䜿çšãããšãæå®ããæéå®è¡ãç¶ç¶ã§ããŸãã åãããªãŒã®æ°ããå®è¡ãæ©èœããå Žåãæ¢åã®å®è¡ã¯ç Žæ£ããããã¹ã«æ²¿ã£ãŠé²ã¿ãŸãã æå®ãããæéå
ã«æ°ããæäœããªãå ŽåãåŸè
ã¯åãå
¥ãããããã¹ã«æ²¿ã£ãŠé²ã¿ãŸãã éåžžããã®ã¢ãããŒãã¯ãå
¥åæã«æ€çŽ¢ãããšãã«äœ¿çšãããŸãã
import debounce from 'function-tree/factories/debounce' export default [ updateSearchQuery, debounce(500), { accepted: [ getData, { success: [ setData, ], error: [ setError ] } ], discarded: [] } ]
RxjsãšPromiseãã§ãŒã³ãšã®éãã¯äœã§ããïŒ
RxjsãšPromisesã®äž¡æ¹ãå®è¡å¶åŸ¡ãå¶åŸ¡ããŸãã ãããããããã®ã©ããå®è¡ã®æ¹æ³ã®å®£èšçãªæ¡ä»¶ä»ãå®çŸ©ãæã£ãŠããŸããã ã¹ã¬ãããã¹ãã³ããã ã ifãèšè¿°ããŠåŒãåãæ¿ãã ã ããšã©ãŒãã¹ããŒããå¿
èŠããããŸãã äžèšã®äŸã§ã¯ã success
ãšerror
å®è¡ãã¹ã颿°ãšåæ§ã«å®£èšsuccess
ã«åé¢ã§ããŸããã ããã«ãããèªã¿ããããåäžããŸãã ãããããããã®ãã¹ã¯çµ¶å¯Ÿã«ä»»æã§ãã äŸïŒ
[ withUserRole, { admin: [], superuser: [], user: [] } ]
ãã¹ã¯ãšã©ãŒåŠçãšã¯é¢ä¿ãããŸããã function-tree
䜿çšãããšãçŸåšã®ãã¹ã®å®è¡ã忢ããå¯äžã®æ¹æ³ã§ãããšã©ãŒãã¹ããŒããpromiseãRxjsãšã¯ç°ãªããå®è¡ã®ä»»æã®ã¹ãããã§ãã¹ãéžæã§ããŸãã
Rxjsãšpromiseã¯ãå€ã®å€æã«åºã¥ããŠããŸãã ããã¯ãåã®å€ã®çµæãšããŠæž¡ãããå€ã®ã¿ã次ã®é¢æ°ã§äœ¿çšã§ããããšãæå³ããŸãã ããã¯ãæ¬åœã«å€ã倿ããå¿
èŠãããå Žåã«å¹æçã§ãã ããããã¢ããªã±ãŒã·ã§ã³ã®ã€ãã³ãã¯ããã§ã¯ãããŸããã ãããã¯å¯äœçšãåŠçãã1ã€ä»¥äžã®å®è¡ãã¹ã«æ²¿ã£ãŠé²ã¿ãŸãã ãããfunction-tree
äž»ãªéãfunction-tree
ã
ã©ãã§ç³è«ã§ããŸããïŒ
颿°ããªãŒã¯ãè€éãªéåæãã§ãŒã³ã®å¯äœçšãåŠçããã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåã«åœ¹ç«ã¡ãŸãã ã¢ããªã±ãŒã·ã§ã³ããžãã¯ããã¬ãŽããããã¯ã«ã匷å¶ãããããšã®å©ç¹ãšãã®ãã¹ãå®¹ææ§ã¯ãéåžžã«éèŠãªè°è«ã«ãªãåŸãŸãã ããã«ããåºæ¬çã«ãããèªã¿ããããµããŒããããã³ãŒããæžãããšãã§ããŸãã
ãã®ãããžã§ã¯ãã¯Githubã®ãªããžããªã«ãããGoogle Chromeã®ãããã¬ãŒæ¡åŒµæ©èœã¯Chrome Web Storeã«ãããŸãã ãªããžããªå
ã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãå¿
ããã§ãã¯ã¢ãŠãããŠãã ããã
function-tree
ãããžã§ã¯ãã®ãœãŒã¹ã¯cerebralã§ãã Cerebralã§ã®ã·ã°ãã«ã®å®è£
ã¯ã function-tree
äžã®ç¬èªã®è¡šçŸã«ããæœè±¡åãšèããããšãã§ãfunction-tree
ã çŸåšãCerebralã¯ç¬èªã®å®è£
ã䜿çšããŠããŸãããCerebral 2.0ã§ã¯ã function-tree
ãã·ã°ãã«ãã¡ã¯ããªã®åºç€ãšããŠäœ¿çšãããŸãã ã¢ã¬ã¯ã»ã€ã»ã°ãªã¢ã«ã倧è³ä¿¡å·ã®ã¢ã€ãã¢ãåŠçãã磚ãäžããŠãããããšã«æè¬ãããããç¬ç«ããäžè¬çãªã¢ãããŒãã®åµé ã«ã€ãªãããŸããã
以äžã®ã³ã¡ã³ãã§ããã®ã¢ãããŒãã«ã€ããŠã©ãæããæããŠãã ããã ãã®èšäºã§èª¬æããåé¡ã解決ããããã®ä»ã®ãã¿ââãŒã³ãæ¹æ³ãžã®ãªã³ã¯ãããå Žåã¯ãå
±æããŠãã ããã èªãã§ãããŠããããšãïŒ