69698


`async functionA` の返り値に非同期関数を指定した場合、functionA の返り値に  
`await` の指定が必要でしょうか？  
（functionAはDBからデータを非同期に取得する想定です）

[code]

    // functionAを呼び出すメインの関数
    async mainFunc() {
        
        const data = await functionA();
    
    }
    
    async functionA () {
        省略
    
        return dummyAsyncFunc();
    }
    // または
    async functionA () {
        省略
    
        return　await dummyAsyncFunc(); 
    }
    
[/code]


CC BY-SA 4.0
2020-08-18T13:40:45.687
69664
2020-08-19T16:37:25.593
2020-08-18T16:28:17.800
3060
34792
question
javascript node.js promise
Async function で非同期関数をリターンする場合に await の指定は必要？


結論としては、`await`を必ずしも指定する必要はありません。（main1関数、main2関数でも同じ結果）

`await`を`async function`に付与することで同期的に処理を書くことができます。  
つまり`await`をつけることで`async
function`の返り値であるPromiseの中身をそのままプログラム中に記述できるようになります。Promiseに関しては[こちら](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)をご参照ください。  
これは例えば`Promise<string>`という返り値の関数があったとき`await`を記述することでその関数の返り値を`string`で扱えるようになるということです。  
大雑把に言えば、非同期関数を実行すると`Promise`という欲しい返り値を格納する箱が作られ、それが関数の結果として返されます。非同期関数はその名の通りいつ処理が完了するか分からない関数なのです。  
なので特殊な型でラップして扱うようになっているわけです。例えば`Promise`には同期できたら~するというようなメソッド`then()`や、非同期処理中に失敗したら~するメソッド`catch()`など非同期を扱えるようにしてくれているわけです。  
同期できたら〜という文脈では`await`を使うことができるわけです。

ただし`await`してしまうと通常の順次実行と同じように実行の完了がない限り処理が進まないわけです。  
非同期処理というのは重い処理だから非同期処理になっているという理由が多々あります（ネットワークI/O, バッチ処理など）。  
なので無闇矢鱈に`await`してしまうとその間にいろいろなことができるのに処理を止めてしまうなんてことになったりします。  
というわけでそういう非同期の旨味を利用したいときには`then()`で書くと良いかと思います！

一応サンプルを記載しましたのでご確認ください！`dummyAsyncFunction`は1秒後に引数の文字列の末尾に!を付け足した文字列を返す非同期関数です。

[code]

    // 出力: $ call api! → 他の処理です
    async function main1() {
        const res = await functionA1();
        console.log(res);
        console.log("他の処理です")
    }
    
    // 出力: $ 他の処理です → call api by awaiting!
    async function main2() {
        functionA2().then(res => console.log(res));
        console.log("他の処理です")
    }
    
    async function functionA1() {
       return dummyAsyncFunction("call api");
    }
    
    async function functionA2() {
        return await dummyAsyncFunction("call api by awaiting")
    }
    
    async function dummyAsyncFunction(message) {
        return new Promise(resolve => {
            setTimeout(() => {
                resolve(message + "!")
            }, (1000));
        });
    }
    
[/code]


CC BY-SA 4.0
2020-08-19T16:30:28.640
69698
2020-08-19T16:37:25.593
2020-08-19T16:37:25.593
41455
41455
69664
answer