「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>JavaScriptのスレッド処理]] --[[Promise (JavaScript)]] --async/await (JavaScript) *目次 [#m0c40497] #contents *概要 [#h7795439] -.NETの [[async/await>https://techinfoofmicrosofttech.osscons.jp/index.php?async%2Fawait]] とは異なる。 -[[Promise>Promise (JavaScript)]]を、更に進化させた実装。 --ジェネレータと [[Promise>Promise (JavaScript)]]を組み合わせたもの。 --[[Promise>Promise (JavaScript)]]を明示する必要がなくなる。 *詳細 [#ydcc8c6a] **async 関数 [#ob2c2475] async 関数 = AsyncFunction -関数定義の前にasyncと付けると、~ その関数は AsyncFunction オブジェクトになる。 -AsyncFunctionは、以下のような動作をする。 ***ステートメント [#n6083752] -[[await 式>#c87fcc24]]を含むことができる。 ***戻り値 [#rfcd8ea0] -return --returnした値は、[[Promise.resolve()>Promise (JavaScript)]]に渡して実行する[[Promise>Promise (JavaScript)]]オブジェクトにラップされて返される。 --returnしなかった場合、undefinedを[[Promise.resolve()>Promise (JavaScript)]]に渡して実行する[[Promise>Promise (JavaScript)]]オブジェクトにラップされて返される。 -throw --また、throwした値は、[[Promise.reject()>Promise (JavaScript)]]に渡して実行する[[Promise>Promise (JavaScript)]]オブジェクトにラップされて返される。 ***結果 [#lb2dd987] このため、 -明示的に[[Promise>Promise (JavaScript)]]オブジェクトを返す必要がなくなる。 -thenで[[Promise>Promise (JavaScript)]]オブジェクトをチェーンする必要がなくなる([[await 式>#c87fcc24]]で、[[Promise>Promise (JavaScript)]]の解決を待つ)。 ***注意 [#xc7c457b] -return ステートメント上で [[await 式>#c87fcc24]]を使用しない。 -async 関数の返値は暗黙的に [[Promise.resolve()>Promise (JavaScript)]] でラップされるため。 **await 式 [#c87fcc24] ***動作 [#af123dd7] -await 式は [[async 関数>#ob2c2475]] の実行を一時停止し、[[Promise>Promise (JavaScript)]]の解決を待つ。 -解決後、[[async 関数>#ob2c2475]] の実行を再開し、解決された値を返す。 ***例外 [#b3ba32ee] -値が [[Promise>Promise (JavaScript)]]ではなかった場合、解決された promise に変換。 -[[Promise>Promise (JavaScript)]]が拒絶された場合、await 式は理由となった値をスロー。 *サンプル・コード [#c6d7838e] **[[Promise>Promise (JavaScript)]] [#ua5cb4eb] -thenのメソッド・チェーンでコールバックを指定する実装になる。 --便宜所、非同期処理を含まない。 --以下から実行可能~ https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/then const promise1 = (num) => { return new Promise(resolve => { resolve(num + 1); }); }; const promise2 = (num) => { return new Promise(resolve => { resolve(num + 2); }); }; const promise3 = (num) => { return new Promise(resolve => { resolve(num + 3); }); }; const promise = promise1(0) .then(num => { return promise2(num); }) .then(num => { return promise3(num); }) .then(num => { console.log(num); }) .catch(error => { console.log(error); }) }); -結果~ 「1 + 2 + 3 = 6」の「6」が表示される。 **async/await [#u17bf9f8] -[[await 式>#c87fcc24]]によって [[Promise>Promise (JavaScript)]]の解決を待つため、処理を同期的に書ける。 --便宜所、非同期処理を含まない。 --以下から実行可能~ https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function const asyncAwait1 = async (num) => { return new Promise(resolve => { resolve(num + 1); }); }; const asyncAwait2 = async (num) => { return new Promise(resolve => { resolve(num + 2); }); }; const asyncAwait3 = async (num) => { return new Promise(resolve => { resolve(num + 3); }); }; const asyncAwait = async () => { var asyncResult1 = await asyncAwait1(0); var asyncResult2 = await asyncAwait2(asyncResult1); var asyncResult3 = await asyncAwait3(asyncResult2); var sum = asyncResult3; console.log(asyncResult3); }; asyncAwait().catch(error => { console.log(error) }); -結果~ 「1 + 2 + 3 = 6」の「6」が表示される。 *参考 [#rc6101e1] -async/awaitを使った非同期処理の書き方 - 30歳からのプログラミング~ http://numb86-tech.hatenablog.com/entry/2017/10/08/192300 -[JavaScript] 僕がasync/awaitを好きなワケ | Developers.IO~ https://dev.classmethod.jp/node-js/javascript-why-do-i-like-async-await/ -ES2017の新機能「async / await」でPromise(非同期処理)をスッキリ書く | maesblog~ https://mae.chab.in/archives/59793 **JavaScript | MDN [#od710c97] -async function~ https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function -await~ https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/await **Qiita [#udcb7f97] -async/await 入門(JavaScript)~ https://qiita.com/soarflat/items/1a9613e023200bbebcb3 >とはいえasync/awaitも[[Promiseを利用しているため、Promise自体の理解は必須>Promise (JavaScript)]]です。 -async await の使い方~ https://qiita.com/niusounds/items/37c1f9b021b62194e077 -Promise再入門 > ② ~async/await編~~ https://qiita.com/gctfuji/items/47d310ae795aa9131c14 -JavaScriptのasync/awaitがPromiseよりもっと良い~ https://qiita.com/Anders/items/dfcb48d8b27ceaffb443 -Promiseの使い方、それに代わるasync/awaitの使い方~ https://qiita.com/suin/items/97041d3e0691c12f4974