.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

  • .NETの async/await とは異なる。
  • Promiseを、更に進化させた実装。
    • ジェネレータと Promiseを組み合わせたもの。
    • Promiseを明示する必要がなくなる。

詳細

async 関数

async 関数 = AsyncFunction?

  • 関数定義の前にasyncと付けると、
    その関数は AsyncFunction? オブジェクトになる。
  • AsyncFunction?は、以下のような動作をする。

ステートメント

戻り値

  • return
    • returnした値は、Promise.resolve()に渡して実行するPromiseオブジェクトにラップされて返される。
    • returnしなかった場合、undefinedをPromise.resolve()に渡して実行するPromiseオブジェクトにラップされて返される。
  • throw
    • また、throwした値は、Promise.reject()に渡して実行するPromiseオブジェクトにラップされて返される。

結果

このため、

  • 明示的にPromiseオブジェクトを返す必要がなくなる。
  • thenでPromiseオブジェクトをチェーンする必要がなくなる(await 式で、Promiseの解決を待つ)。

注意

  • return ステートメント上で await 式を使用しない。
  • async 関数の返値は暗黙的に Promise.resolve() でラップされるため。

await 式

動作

  • await 式は async 関数 の実行を一時停止し、Promiseの解決を待つ。
  • 解決後、async 関数 の実行を再開し、解決された値を返す。

例外

  • 値が Promiseではなかった場合、解決された promise に変換。
  • Promiseが拒絶された場合、await 式は理由となった値をスロー。

サンプル・コード

Promise

  • 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

  • await 式によって Promiseの解決を待つため、処理を同期的に書ける。
    • 便宜所、非同期処理を含まない。
    • 以下から実行可能
      https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
      const asyncAwait1 = async (num) => {
          return await num + 1
      }
       
      const asyncAwait2 = async (num) => {
          return await num + 2
      }
       
      const asyncAwait3 = async (num) => {
          return await 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」が表示される。

参考

JavaScript | MDN

Qiita


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-07 (水) 09:03:47 (1047d)