

お世話になっています。  
タイトルのとおりなのですが、以下に示したようなコードをasync/awaitで同じ処理をするように書き換えることはできますか？

[code]

    function hello(){
        return new Promise((resolve,reject) => {
            setTimeout(() => {
                resolve('hello');
            },2000);
        });
    }
    
    hello().then((result) => {
        console.log(result);
    });
    
[/code]

自分で調べてみて「おそらくできないのではないか」と結論付けたのですが、「もしかしたらできるのでは、、？」などとも考えてしまい、質問させていただきました。  
初歩的な質問かもしれませんが教えて頂けると嬉しいです、よろしくお願い致します。


CC BY-SA 4.0
2020-03-02T13:56:19.613
63500
2020-03-03T01:58:58.640
2020-03-02T15:13:24.923
32986
35844
question
javascript node.js promise
以下のようなPromiseを利用したコードをasync/awaitで書き換えることは可能でしょうか？


お考えの通り、async/awaitでこれを書き換えることはできません。

特にhello関数に関しては、このようにコールバック関数による非同期処理をPromiseに変換する目的で`new
Promise`でPromiseを作る場合は、これをasync関数に書き換えることはできません。hello関数はこのように書くほか無いと思います。

プログラムの後半部分に関しても、async関数のの中でない場所では`await`を使用できないので、`hello()`の結果を待つためにはこのように`then`を使用する必要があります。

* * *

ただし、将来的に **top-level await**
がJavaScriptに導入される予定であり、これが導入されれば後半部分を次のように書き換えることができるようになります。

[code]

    const result = await hello();
    console.log(result);
    
[/code]

top-level
awaitは、「async関数の中」以外に「モジュールのトップレベル」にも`await`を書くことができるようになるという機能です。モジュールのトップレベルというのは、モジュールであるJavaScriptファイルの一番外側、つまり他の関数の中ではない場所です。


CC BY-SA 4.0
2020-03-02T14:18:57.000
63502
2020-03-02T14:18:57.000
30079
63500
answer


一度 `async` で囲うと可能です。

Topレベルでいきなり `await` をつかうのは Faily Feelyさんも書かれている通り、今のところ不可能だと思います。

`async`で囲った例は下記です。

[code]

    function hello(){
      return new Promise((resolve,reject) => {
          setTimeout(() => {
              resolve('hello');
          },2000);
      });
    }
    
    async function hoge() {
      result = await hello()
      console.log(result)
    }
    
    hoge()
    
[/code]

## 無名関数で即時実行させる場合

名前を考えるのが手間で、無名関数を使いたい場合は下記の書き方もできます。

[code]

    function hello(){
      return new Promise((resolve,reject) => {
          setTimeout(() => {
              resolve('hello');
          },2000);
      });
    }
    
    (async function() {
      result = await hello()
      console.log(result)
    })();
    
[/code]

## 参考資料

参考資料としては、  
こちらのドキュメントがご質問の内容とほぼ同じようなソースとなっているかと思います。

[async function - JavaScript |
MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)

### 引用

[code]

    function resolveAfter2Seconds() {
      return new Promise(resolve => {
        setTimeout(() => {
          resolve('resolved');
        }, 2000);
      });
    }
    
    async function asyncCall() {
      console.log('calling');
      const result = await resolveAfter2Seconds();
      console.log(result);
      // expected output: 'resolved'
    }
    
    asyncCall();
    
[/code]


CC BY-SA 4.0
2020-03-03T00:01:17.867
63511
2020-03-03T01:58:58.640
2020-03-03T01:58:58.640
9008
9008
63500
answer