äœæè
ããã®ã³ãŒããèªãã§ãã人ãæ··ä¹±ãããããšãæ±ããŠããªãåæJavaScriptã³ãŒãã¯ãéåžžãåçŽã§æ確ã«èŠããŸãã ãããæ§æããã³ãã³ãã¯ãããã°ã©ã ã®ããã¹ãã§ããããåŸãé åºã§å®è¡ãããŸãã å€æ°ãšé¢æ°ã®å®£èšã
äžããã®ã¯å°ããããã«ãããããããŸãããããã®JSæ©èœãåé¡ã«å€ããã«ã¯éåžžã«äžçæžåœåªåããå¿
èŠããããŸãã åæJavaScriptã³ãŒãã«ã¯ãé倧ãªæ¬ ç¹ã1ã€ãããããŸãããã€ãŸããããã ãã§ã¯ååã§ã¯ãããŸããã

ã»ãŒãã¹ãŠã®æçšãªJSããã°ã©ã ã¯ãéåæéçºã¡ãœããã䜿çšããŠèšè¿°ãããŠããŸãã ããã§ãã³ãŒã«ããã¯é¢æ°ãå£èªçã«äœçšããŸã-ãã³ãŒã«ããã¯ãã ããã¯ãPromiseããŸãã¯éåžžPromiseãšåŒã°ããPromiseãªããžã§ã¯ãã䜿çšãããå Žæã§ãã ããã§ããžã§ãã¬ãŒã¿ãŒãšasync / awaitã³ã³ã¹ãã©ã¯ããå®è¡ã§ããŸãã éåæã³ãŒãã¯ãåæãšæ¯èŒããŠãéåžžãæžã蟌ã¿ãèªã¿åããããã³ä¿å®ãå°é£ã§ãã ã³ãŒã«ããã¯å°çã®ãããªå®å
šã«äžæ°å³ãªæ§é ã«å€ããããšããããŸãã ãããããããªãã§ã¯ã§ããŸããã
ä»æ¥ã¯ãã³ãŒã«ããã¯ããããã¹ããžã§ãã¬ãŒã¿ãŒãasync / awaitã³ã³ã¹ãã©ã¯ãã®æ©èœã«ã€ããŠèª¬æããã·ã³ãã«ã§ç解ãããããå¹ççãªéåæã³ãŒãã®æžãæ¹ãèããŸãã
åæããã³éåæã³ãŒãã«ã€ããŠ
åæJSã³ãŒããšéåæJSã³ãŒãã®ãã©ã°ã¡ã³ããèŠãŠã¿ãŸãããã ããšãã°ãéåžžã®åæã³ãŒãã¯æ¬¡ã®ãšããã§ãã
console.log('1') console.log('2') console.log('3')
圌ã¯ãããã»ã©å°é£ãªããã³ã³ãœãŒã«ã«1ãã3ãŸã§ã®æ°åã衚瀺ããŸãã
ããã§ã³ãŒãã¯éåæã«ãªããŸããïŒ
console.log('1') setTimeout(function afterTwoSeconds() { console.log('2') }, 2000) console.log('3')
ããã§ã¯ãã·ãŒã±ã³ã¹1ã3ã2ããã§ã«è¡šç€ºãããŠããŸãçªå·2ã¯ã
setTimeout
é¢æ°ãåŒã³åºããããšãã«èšå®ãããã¿ã€ããŒã€ãã³ããåŠçããã³ãŒã«ããã¯ãã掟çããŠããŸãã ãã®äŸã§ã¯ã2ç§åŸã«ã³ãŒã«ããã¯ãåŒã³åºãããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯åæ¢ããããããã®2ç§ãçµéããã®ãåŸ
ã¡ãŸãã 代ããã«ãå®è¡ãç¶ç¶ãããã¿ã€ããŒãåãããšã
afterTwoSeconds
é¢æ°ãåŒã³åºãããŸãã
ãã¶ããããªããJSéçºè
ãšããŠå§ããã°ãããªããããªãã¯èªåãããããããŸããã ããããéåæã³ãŒããåæã«åäœæããããšã¯å¯èœã§ããïŒã ãããã®è³ªåã«å¯Ÿããçããæ¢ããŸãããã
åé¡ã®å£°æ
GitHubãŠãŒã¶ãŒãèŠã€ããŠã圌ã®ãªããžããªã«é¢ããããŒã¿ãããŠã³ããŒãããã¿ã¹ã¯ã«çŽé¢ããŠãããšããŸãã ããã§ã®äž»ãªåé¡ã¯ãæ£ç¢ºãªãŠãŒã¶ãŒåãããããªãããšã§ãããã®ãããæ¢ããŠãããã®ãšãã®ãªããžããªã«äŒŒãååãæã€ãã¹ãŠã®ãŠãŒã¶ãŒããªã¹ãããå¿
èŠããããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããŠã¯ã
åçŽãªãã®ã«å¶éããŠããŸãã
GitHubãŠãŒã¶ãŒããã³å¯Ÿå¿ãããªããžããªçšã®ã·ã³ãã«ãªæ€çŽ¢ã€ã³ã¿ãŒãã§ã€ã¹äŸã§ã¯ãã¯ãšãªã¯
XMLHttpRequest
ïŒXHRïŒã䜿çšããŠå®è¡ãããŸãããjQueryïŒ
$.ajax
ïŒããŸãã¯
fetch
é¢æ°ã®äœ¿çšã«åºã¥ãããçŸä»£çãªæšæºã¢ãããŒãã䜿çšã§ããŸãã ãããã¯äž¡æ¹ãšããçŽæã®äœ¿çšã«èŠçŽãããŸãã ã³ãŒãã¯ãæ
è¡ã«å¿ããŠå€æŽãããŸãããæåã®äŸã§ã¯ããã®äŸã¯æ¬¡ã®ãšããã§ãã
// url - 'https://api.github.com/users/daspinola/repos' function request(url) { const xhr = new XMLHttpRequest(); xhr.timeout = 2000; xhr.onreadystatechange = function(e) { if (xhr.readyState === 4) { if (xhr.status === 200) { // } else { // } } } xhr.ontimeout = function () { // , , } xhr.open('get', url, true) xhr.send(); }
ãããã®äŸã§ã¯ãæçµçã«ãµãŒããŒããåŸããããã®ããã®åŠçæ¹æ³ã§ã¯ãªããéåæèšèšã§äœ¿çšã§ããããŸããŸãªã¢ãããŒãã䜿çšããã³ãŒãèªäœã®ç·šæãéèŠã§ããããšã«æ³šæããŠãã ããã
ã³ãŒã«ããã¯é¢æ°
JSã®é¢æ°ã§ã¯ãä»ã®é¢æ°ãžã®åŒæ°ãšããŠæž¡ããªã©ãå€ãã®ããšãã§ããŸãã éåžžãããã¯ãäœããã®ããã»ã¹ã®å®äºåŸã«è»¢éãããé¢æ°ãåŒã³åºãããã«è¡ãããŸãããããã«ã¯æéããããå ŽåããããŸãã ã³ãŒã«ããã¯é¢æ°ã«ã€ããŠã§ãã 以äžã«ç°¡åãªäŸã瀺ããŸãã
// "doThis" , - "andThenThis". "doThis" , , , , "andThenThis". doThis(andThenThis) // "doThis" "callback" , , , function andThenThis() { console.log('and then this') } // , , , "callback" - function doThis(callback) { console.log('this first') // , , , , , '()', callback() }
ãã®ã¢ãããŒãã䜿çšããŠåé¡ã解決ããããã«ã次ã®
request
é¢æ°ãäœæã§ããŸãã
function request(url, callback) { const xhr = new XMLHttpRequest(); xhr.timeout = 2000; xhr.onreadystatechange = function(e) { if (xhr.readyState === 4) { if (xhr.status === 200) { callback(null, xhr.response) } else { callback(xhr.status, null) } } } xhr.ontimeout = function () { console.log('Timeout') } xhr.open('get', url, true) xhr.send(); }
çŸåšããªã¯ãšã¹ããå®è¡ããããã®é¢æ°ã¯
callback
ãã©ã¡ãŒã¿ãåãå
¥ããããããªã¯ãšã¹ããå®è¡ããŠãµãŒããŒã¬ã¹ãã³ã¹ãåä¿¡ããåŸããšã©ãŒãçºçããå Žåãããã³æäœãæ£åžžã«å®äºããå Žåã«ã³ãŒã«ããã¯ãåŒã³åºãããŸãã
const userGet = `https://api.github.com/search/users?page=1&q=daspinola&type=Users` request(userGet, function handleUsersList(error, users) { if (error) throw error const list = JSON.parse(users).items list.forEach(function(user) { request(user.repos_url, function handleReposList(err, repos) { if (err) throw err
ããã§äœãèµ·ããããåæããŸãããïŒ
- ãŠãŒã¶ãŒãªããžããªãååŸããããã®ãªã¯ãšã¹ããå®è¡ãããŸãïŒãã®å Žåãèªåã®ãªããžããªãããŒãããŸãïŒã
- èŠæ±ãå®äºãããšã
handleUsersList
handleUsersListãhandleUsersList
ãŸãã
- ãšã©ãŒããªãã£ãå ŽåãJ
SON.parse
ã䜿çšããŠãµãŒããŒã®å¿çã解æãã䟿å®äžããªããžã§ã¯ãã«å€æããŸãã
- ãã®åŸããŠãŒã¶ãŒã®ãªã¹ãããœãŒãããŸããè€æ°ã®èŠçŽ ãå«ãŸããŠããå¯èœæ§ããããããåãŠãŒã¶ãŒã«å¯ŸããŠãæåã®ãªã¯ãšã¹ãåŸã«åãŠãŒã¶ãŒã«è¿ãããURLã䜿çšããŠãªããžããªã®ãªã¹ãããªã¯ãšã¹ãããŸãã ããã¯ã
repos_url
ã次ã®ãªã¯ãšã¹ãã®URLã§ãããæåã®ãªã¯ãšã¹ãããååŸããããšãæå³ããŸãã
- ãªããžããªããŒã¿ãããŠã³ããŒããããªã¯ãšã¹ããå®äºãããšãã³ãŒã«ããã¯ãåŒã³åºãããŸããçŸåšã¯
handleReposList
ã§ãã ããã§ã¯ããŠãŒã¶ãŒã®ãªã¹ããããŒããããšããšåãããã«ããŠãŒã¶ãŒãªããžããªã®ãªã¹ããå«ããšã©ãŒãŸãã¯æçšãªããŒã¿ãåŠçã§ããŸãã
ãªããžã§ã¯ãã®æåã®ãã©ã¡ãŒã¿ãŒãšããŠãšã©ãŒã䜿çšããããšã¯ãç¹ã«Node.jsã䜿çšããéçºã§ã¯åºãè¡ãããŠããããšã«æ³šæããŠãã ããã
ã³ãŒããããå®å
šã«èŠãŠããšã©ãŒåŠçããŒã«ãè£
åããã³ãŒã«ããã¯é¢æ°ã®å®çŸ©ãã¯ãšãªå®è¡ã³ãŒãããåé¢ãããšãããã°ã©ã ã®å¯èªæ§ãåäžããŸãã次ã®ããã«ãªããŸãã
try { request(userGet, handleUsersList) } catch (e) { console.error('Request boom! ', e) } function handleUsersList(error, users) { if (error) throw error const list = JSON.parse(users).items list.forEach(function(user) { request(user.repos_url, handleReposList) }) } function handleReposList(err, repos) { if (err) throw err
ãã®ã¢ãããŒãã¯æ©èœããŸãããããã䜿çšãããšãã¯ãšãªã¬ãŒã¹ã®ç¶æ
ããšã©ãŒåŠçã®åé¡ãªã©ã®åé¡ãçºçãããªã¹ã¯ããããŸãã ãã ããã³ãŒã«ããã¯ã«é¢é£ããäž»ãªè¿·æã¯ã
forEach
ã«ãŒãã§äœãèµ·ããããèæ
®ãããšãããã§ã¯3ã€ã§ããããã®ãããªã³ãŒãã¯èªã¿ã«ãããä¿å®ãé£ãããšããããšã§ãã åæ§ã®åé¡ã¯ãããããã³ãŒã«ããã¯é¢æ°ãç»å Žããæ¥ããååšããŸã;ããã¯ã³ãŒã«ããã¯å°çãšããŠåºãç¥ãããŠããŸãã
ãã¹ãŠã®æ å
ã®å°çã³ãŒã«ããã¯ã ããããæ®åœ±ããç»åããã®å Žåãã競åç¶æ
ããšã¯ããŠãŒã¶ãŒãªããžããªã«é¢ããããŒã¿ãååŸããæé ãå¶åŸ¡ããªãç¶æ³ãæå³ããŸãã ç§ãã¡ã¯ãã¹ãŠã®ãŠãŒã¶ãŒã®ããŒã¿ãèŠæ±ããŸããããããã®èŠæ±ãžã®åçãæ··åšããŠããããšãå€æããå ŽåããããŸãã 10çªç®ã®ãŠãŒã¶ãŒã«å¯Ÿããçããæåã«æ¥ãŠã2çªç®ã®ãŠãŒã¶ãŒã«å¯ŸããçããæåŸã ãšããŸãããã 以äžã«ããã®åé¡ã®å¯èœãªè§£æ±ºçã«ã€ããŠèª¬æããŸãã
çŽæ
promiseã䜿çšãããšãã³ãŒããèªã¿ããããªããŸãã ãã®çµæãããšãã°ãæ°ããéçºè
ãããââãžã§ã¯ãã«æ¥ãå Žåã圌ã¯ãã¹ãŠãããã§ã©ã®ããã«é
眮ãããŠããããããã«ç解ããŸãã
çŽæãäœæããã«ã¯ã次ã®èšèšã䜿çšã§ããŸãã
const myPromise = new Promise(function(resolve, reject) { // if (codeIsFine) { resolve('fine') } else { reject('error') } }) myPromise .then(function whenOk(response) { console.log(response) return response }) .catch(function notOk(err) { console.error(err) })
ãã®äŸãèŠãŠã¿ãŸãããïŒ
- promiseã¯ã
resolve
ã¡ãœãããšreject
ã¡ãœããã®åŒã³åºããããé¢æ°ã䜿çšããŠåæåãããŸãã
- éåæã³ãŒãã¯ã
Promise
ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠäœæãããé¢æ°å
ã«é
眮ãããŸãã ã³ãŒããæåããå Žåã¯ã resolve
ã¡ãœãããåŒã³åºãããããã§ãªãå Žåã¯reject
ãåŒã³åºãããŸãã
- é¢æ°ã
resolve
åŒã³åºããšã Promise
ãªããžã§ã¯ãã®.then
ã¡ãœãããå®è¡ãããŸããåæ§ã«ã reject
ãåŒã³åºããããšã .catch
ã¡ãœãããå®è¡ãããŸãã
çŽæãåŠçããéã«èŠããŠããã¹ãããšãããã€ããããŸãã
resolve
ããã³reject
ã¡ãœããã¯ãçµæãšããŠãããšãã°ãã¿ã€ãresolve('yey', 'works')
ã³ãã³ããå®è¡ããå Žåã1ã€ã®ãã©ã¡ãŒã¿ãŒã®ã¿ãåãå
¥ã'yey'
ã
- è€æ°ã®
.then
åŒã³åºãããã§ãŒã³ã«ãã§ãŒã³ããå Žåã¯ã察å¿ããã³ãŒã«ããã¯ã®æåŸã«åžžã«return
ã䜿çšããå¿
èŠããããŸããããããªããšããããã¯ãã¹ãŠåæã«å®è¡ãããŸããããã¯æããã«éæãããããšã§ã¯ãããŸããã
reject
ã³ãã³ããå®è¡ããããšãã«ããã§ãŒã³ã®æ¬¡ã.then
ã§ããå Žåããããå®è¡ãããŸãïŒ .then
ã¯ãšã«ããå®è¡ãããåŒãšèŠãªãããšãã§ããŸãïŒã
- ããããã®
.then
åŒã³åºãã®ãã§ãŒã³ã§ãšã©ãŒãçºçããå Žåãããã«ç¶ããã®ã¯.catch
åŒã.catch
ãŸã§ã¹ããã.catch
ãŸãã
- Promiseã«ã¯3ã€ã®ç¶æ
ããããŸãããä¿çã-
resolve
ãŸãã¯reject
åŒã³åºãã®åŸ
æ©ç¶æ
ãããã³ãresolvedãããã³ãrejectedãã®ç¶æ
ãããã¯ãæåã resolve
åŒã³åºããããã³å€±æã®åŒã³åºããçŽæã®äœæ¥ã®çµäºã«å¯Ÿå¿ããŸãã ãããã¹ã解決æžã¿ãŸãã¯æåŠæžã¿ã®ç¶æ
ã«ããå Žåãããã¯å€æŽã§ããªããªããŸãã
å¥ã
ã«å®çŸ©ãããé¢æ°ã䜿çšããã«ãããã¹ãäœæã§ããããšã«æ³šæããŠãã ããããããã¹ã®äœææã®é¢æ°ãèšè¿°ããŸãã ãã®äŸã§ç€ºãããŠããã®ã¯ãPromiseãåæåããäžè¬çãªæ¹æ³ã§ãã
çè«äžã§ãµãã€ããªãããã«ãäŸã«æ»ããŸãããã promiseã䜿çšããŠæžãæããŸãã
function request(url) { return new Promise(function (resolve, reject) { const xhr = new XMLHttpRequest(); xhr.timeout = 2000; xhr.onreadystatechange = function(e) { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.response) } else { reject(xhr.status) } } } xhr.ontimeout = function () { reject('timeout') } xhr.open('get', url, true) xhr.send(); }) }
ãã®ã¢ãããŒãã§ã¯ã
request
ãåŒã³åºããšã次ã®ãããªãã®ãè¿ãããŸãã
ããã¯ä¿çäžã®çŽæã§ãã æ£åžžã«è§£æ±ºãããæåŠããããšãã§ããŸãã次ã«ãæ°ãã
request
é¢æ°ã䜿çšããŠãæ®ãã®ã³ãŒããæžãçŽããŸãã
const userGet = `https://api.github.com/search/users?page=1&q=daspinola&type=Users` const myPromise = request(userGet) console.log('will be pending when logged', myPromise) myPromise .then(function handleUsersList(users) { console.log('when resolve is found it comes here with the response, in this case users ', users) const list = JSON.parse(users).items return Promise.all(list.map(function(user) { return request(user.repos_url) })) }) .then(function handleReposList(repos) { console.log('All users repos in an array', repos) }) .catch(function handleErrors(error) { console.log('when a reject is executed it will come here ignoring the then statement ', error) })
ããã§ã¯ãæåã®è¡šçŸã«èªåèªèº«ãèŠã€ãã
.then
çŽæã®è§£æ±ºã«æåããŸããã ãŠãŒã¶ãŒã®ãªã¹ãããããŸãã 2çªç®ã®
.then
åŒã§ã¯ããªããžããªã«é
åãæž¡ããŸãã äœããããŸããããªãã£ãå Žåã
.catch
åŒã«ãªããŸãã
ãã®ã¢ãããŒãã®ãããã§ãç§ãã¡ã¯ã¬ãŒã¹ã®ç¶æ
ãšãããããããšã§çããããã€ãã®åé¡ãææ¡ããŸããã ããã§ã¯ã³ãŒã«ããã¯ã®å°çã¯èŠ³å¯ãããŸããããã³ãŒãã¯ãŸã ããã»ã©èªã¿ããããããŸããã å®éããã®äŸã§ã¯ãã³ãŒã«ããã¯é¢æ°ã®å®£èšã匷調衚瀺ããããšã«ãããããã«æ¹åããããšãã§ããŸãã
const userGet = `https://api.github.com/search/users?page=1&q=daspinola&type=Users` const userRequest = request(userGet) // , userRequest .then(handleUsersList) .then(repoRequest) .then(handleReposList) .catch(handleErrors) function handleUsersList(users) { return JSON.parse(users).items } function repoRequest(users) { return Promise.all(users.map(function(user) { return request(user.repos_url) })) } function handleReposList(repos) { console.log('All users repos in an array', repos) } function handleErrors(error) { console.error('Something went wrong ', error) }
ãã®ã¢ãããŒãã§ã¯ã
.then
åŒã®ã³ãŒã«ããã¯åãèŠããšã
userRequest
ãåŒã³åºãæå³ã
userRequest
ãŸãã ã³ãŒãã¯æ±ãããããèªã¿ãããã§ãã
å®éãããã¯çŽæãšåŒã°ãããã®ã®æ°·å±±ã®äžè§ã«ãããŸããã ãã®ãããã¯ããã培åºçã«æãäžããã人ã«èªãããšããå§ããã
è³æããããŸãã
çºé»æ©
ç§ãã¡ã®åé¡ã解決ããå¥ã®ã¢ãããŒãã¯ãããããããªããé »ç¹ã«åºäŒãããšã¯ãªãã§ããããããžã§ãã¬ãŒã¿ãŒã§ãã ãã®ãããã¯ã¯ä»ã®ãããã¯ãããå°ãè€éãªã®ã§ãå匷ããã«ã¯ææå°æ©ã ãšæããå Žåã¯ããã®è³æã®æ¬¡ã®ã»ã¯ã·ã§ã³ã«ããã«é²ãããšãã§ããŸãã
ãžã§ãã¬ãŒã¿ãŒé¢æ°ãå®çŸ©ããã«ã¯ãããŒã¯ãŒã
function
åŸã«ã¢ã¹ã¿ãªã¹ã¯ã*ãã䜿çšã§ããŸãã ãžã§ãã¬ãŒã¿ãŒã䜿çšãããšãéåæã³ãŒããåæã«éåžžã«äŒŒããã®ã«ããããšãã§ããŸãã ããšãã°ã次ã®ããã«ãªããŸãã
function* foo() { yield 1 const args = yield 2 console.log(args) } var fooIterator = foo() console.log(fooIterator.next().value) // 1 console.log(fooIterator.next().value) // 2 fooIterator.next('aParam') // console.log 'aParam'
ããã§ã®ãã€ã³ãã¯ããžã§ãã¬ãŒã¿ãŒã
return
代ããã«
yield
åŒã䜿çšãã次ã®
.next
ã€ãã¬ãŒã¿ãŒã®åŒã³åºããŸã§é¢æ°ã®å®è¡ãåæ¢ããããšã§ãã ããã¯ãpromiseã解決ãããšãã«å®è¡ãããpromiseã®
.then
åŒã«äŒŒãŠããŸãã
次ã«ãããããã¹ãŠãã¿ã¹ã¯ã«é©çšããæ¹æ³ãèŠãŠã¿ãŸãããã
request
é¢æ°ã¯æ¬¡ã®ãšããã§ãã
function request(url) { return function(callback) { const xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(e) { if (xhr.readyState === 4) { if (xhr.status === 200) { callback(null, xhr.response) } else { callback(xhr.status, null) } } } xhr.ontimeout = function () { console.log('timeout') } xhr.open('get', url, true) xhr.send() } }
ããã§ã¯ããã€ãã®ããã«
url
åŒæ°ã䜿çšããŸããããªã¯ãšã¹ããããã«å®è¡ããã®ã§ã¯ãªããã¬ã¹ãã³ã¹ãåŠçããã³ãŒã«ããã¯é¢æ°ãããå Žåã«ã®ã¿ãªã¯ãšã¹ããå®è¡ããŸãã
ãžã§ãã¬ãŒã¿ã¯æ¬¡ã®ããã«ãªããŸãã
function* list() { const userGet = `https://api.github.com/search/users?page=1&q=daspinola&type=Users` const users = yield request(userGet) yield for (let i = 0; i<=users.length; i++) { yield request(users[i].repos_url) } }
ããã§äœãèµ·ãããã§ãïŒ
- é¢æ°ãžã®ãªã³ã¯ãè¿ãããã®æåã®ãªã¯ãšã¹ãã®ã³ãŒã«ããã¯ãåŸ
æ©ããããšã§ãæåã®ãªã¯ãšã¹ããæºåãããããšãæåŸ
ããŸãïŒ
url
ãåãå
¥ããã³ãŒã«ããã¯ãæåŸ
ããé¢æ°ãè¿ãrequest
é¢æ°ãæãåºããŠãã ããïŒã
- ãŠãŒã¶ãŒã®ãªã¹ãusersã次ã®
.next
éä¿¡ãããã®ã.next
ãŸãã
- çµæã®
users
é
åã.next
ãããããã«å¯ŸããŠ.next
ã察å¿ããã³ãŒã«ããã¯ãè¿ãããšãæåŸ
ããŸãã
ããããã¹ãŠäœ¿çšãããšã次ã®ããã«ãªããŸãã
try { const iterator = list() iterator.next().value(function handleUsersList(err, users) { if (err) throw err const list = JSON.parse(users).items // iterator.next(list) list.forEach(function(user) { iterator.next().value(function userRepos(error, repos) { if (error) throw repos // console.log(user, JSON.parse(repos)) }) }) }) } catch (e) { console.error(e) }
ããã§ãåãŠãŒã¶ãŒã®ãªããžããªã®ãªã¹ããåå¥ã«åŠçã§ããŸãã ãã®ã³ãŒããæ¹åããããã«ããã§ã«äžã§è¡ã£ãããã«ãã³ãŒã«ããã¯é¢æ°ãåºå¥ã§ããŸãã
ãžã§ãã¬ãŒã¿ãŒã«ã€ããŠã¯ãããŸãã§ãã äžæ¹ã§ã¯ããžã§ãã¬ãŒã¿ãŒãèŠãããšã§ã³ãŒãã«äœãæåŸ
ããããããã«ç解ã§ããŸããä»æ¹ã§ã¯ããžã§ãã¬ãŒã¿ãŒã®å®è¡ã¯ã³ãŒã«ããã¯å°çã§çºçããåé¡ãšåæ§ã®åé¡ã«ã€ãªãããŸãã
ãžã§ãã¬ãŒã¿ãŒã¯æ¯èŒçæ°ããæ©èœã§ãããããå€ãããŒãžã§ã³ã®ãã©ãŠã¶ãŒã§ã³ãŒãã®äœ¿çšãæåŸ
ããŠããå Žåããã©ã³ã¹ãã€ã©ãŒã§ã³ãŒããåŠçããå¿
èŠãããããšã«æ³šæããŠãã ããã ããã«ãéåæã³ãŒããèšè¿°ãããžã§ãã¬ãŒã¿ãŒã¯ããŸã䜿çšãããªããããããŒã éçºã«é¢äžããŠããå Žåãäžéšã®ããã°ã©ããŒã¯ãããã«æ
£ããŠããªãå¯èœæ§ãããããšã«æ³šæããŠãã ããã
ãã®å Žåããã®ãããã¯ãããããç解ããããšã«ããå Žåããžã§ãã¬ãŒã¿ãŒã®å
éšæ§é ã«é¢ããåªããè³æ
ããããŸãã
éåæ/åŸ
æ©
ãã®æ¹æ³ã¯ããžã§ãã¬ãŒã¿ãŒãšãããã¹ã®æ··åã«äŒŒãŠããŸãã éåæã«å®è¡ãããé¢æ°ã
async
ã§æå®ãã
await
ã䜿çšã
await
ã察å¿ãããããã¹ã解決ãããã®ãã³ãŒãã®ã©ã®éšåã§åŸ
ã€ããã·ã¹ãã ã«æ瀺ããã ãã§ãã
ãã€ãã®ããã«ãæåã«ç°¡åãªäŸã瀺ããŸãã
sumTwentyAfterTwoSeconds(10) .then(result => console.log('after 2 seconds', result)) async function sumTwentyAfterTwoSeconds(value) { const remainder = afterTwoSeconds(20) return value + await remainder } function afterTwoSeconds(value) { return new Promise(resolve => { setTimeout(() => { resolve(value) }, 2000); }); }
ããã§æ¬¡ã®ããšãèµ·ãããŸãã
- éåæé¢æ°
sumTwentyAfterTwoSeconds
ãŸãã
- ã³ãŒãã¯afterTwoSeconds
afterTwoSeconds
解決ãåŸ
ã€ããšããå§ãreject
ãŸãã
- ã³ãŒãã®å®è¡ã¯
.then
ã§çµäºããããã§await
ããŒã¯ãŒãã§ããŒã¯ãããæäœãçµäºããŸãããã®å Žåãããã¯1ã€ã®æäœã§ãã
async/await
ã³ã³ã¹ãã©ã¯ãã§äœ¿çšãã
request
é¢æ°ãæºåããŸãã
function request(url) { return new Promise(function(resolve, reject) { const xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(e) { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(xhr.response) } else { reject(xhr.status) } } } xhr.ontimeout = function () { reject('timeout') } xhr.open('get', url, true) xhr.send() }) }
async
ã䜿çšã
await
é¢æ°ãäœæããŸããããã§
await
ããŒã¯ãŒãã䜿çšããŸãã
async function list() { const userGet = `https://api.github.com/search/users?page=1&q=daspinola&type=Users` const users = await request(userGet) const usersList = JSON.parse(users).items usersList.forEach(async function (user) { const repos = await request(user.repos_url) handleRepoList(user, repos) }) } function handleRepoList(user, repos) { const userRepos = JSON.parse(repos)
ãã®ããããªã¯ãšã¹ããåŠçããéåæ
list
é¢æ°ããããŸãã ãŸãããªããžããªã®ãªã¹ããäœæããã«ã¯ã
forEach
ã«ãŒãã«
async/await
ã³ã³ã¹ãã©ã¯ããå¿
èŠã§ãã ãã¹ãŠãåŒã³åºãã®ã¯éåžžã«ç°¡åã§ãã
list() .catch(e => console.error(e))
ãã®ã¢ãããŒããšãããã¹ã®äœ¿çšã¯ãéåæããã°ã©ãã³ã°ã®ç§ã®ãæ°ã«å
¥ãã®æ¹æ³ã§ãã ãããã䜿çšããŠèšè¿°ãããã³ãŒãã¯ãèªã¿åããç·šéã«äŸ¿å©ã§ãã
async/await
詳现ã«ã€ããŠã¯ã
ãã¡ããã芧ãã ãã ã
async/await
ã®ãã€ãã¹ãããã³ãžã§ãã¬ãŒã¿ãŒã®ãã€ãã¹ã¯ããã®èšèšãå€ããã©ãŠã¶ã§ãµããŒããããŠããªãããšã§ãããµãŒããŒéçºã§äœ¿çšããã«ã¯ãããŒã8ã䜿çšããå¿
èŠããããŸãã
ãŸãšã
ããã§ã
async/await
ã䜿çšããŠããããªã¢ã«ã®å
é ã«ããåé¡ã解決ãããããžã§ã¯ãã³ãŒãã確èªã§ããŸãã 話ããããšãé©åã«åŠçãããå Žåã¯ããã®ã³ãŒããšã説æãããã¹ãŠã®ãã¯ãããžãŒãè©ŠããŠãã ããã
$.ajax
ã
fetch
ãªã©ã®å¥ã®ã¯ãšãªå®è¡æ¹æ³ã䜿çšããŠäŸãæžãæãããšãäŸãæ¹åããç°¡æœã«ãªãããšã«æ³šæããŠãã ããã äžèšã®æ¹æ³ã䜿çšããŠã³ãŒãã®å質ãæ¹åããæ¹æ³ã«ã€ããŠã¢ã€ãã¢ããæã¡ã®å Žåãããã«ã€ããŠæã
ãŠããã ããã°å¹žãã§ãã
å²ãåœãŠãããã¿ã¹ã¯ã®è©³çŽ°ã«å¿ããŠãéåæ/åŸ
æ©ãã³ãŒã«ããã¯ããŸãã¯ç°ãªããã¯ãããžãŒã®æ··åã䜿çšããããšãå€æããå ŽåããããŸãã å®éãã©ã®éåæéçºææ³ãéžæããããšãã質åã«å¯Ÿããçãã¯ããããžã§ã¯ãã®æ©èœã«ãã£ãŠç°ãªããŸãã ã¢ãããŒãããããªããšä»ã®ããŒã ã¡ã³ããŒã«ãšã£ãŠç解ããããïŒãããŠããã°ãããããšæããã«ãªãïŒä¿å®ããããèªã¿åãå¯èœãªã³ãŒãã䜿çšããŠåé¡ã解決ã§ããå Žåããã®ã¢ãããŒããå¿
èŠã§ãã
芪æãªãèªè
ïŒ éåæJavaScriptã³ãŒããèšè¿°ããããã«ã©ã®ãããªãã¯ããã¯ã䜿çšããŸããïŒ