非同期関数は常に await で呼び出す必要がありますか? 質問する

非同期関数は常に await で呼び出す必要がありますか? 質問する

まず背景を説明します。MongoDB データベースにメッセージを記録する非同期関数があります。

async function log_message(sender, conversationId, text) {
    try {
        const msg = new Message({
            sender: sender,
            conversationId: conversationId,
            text: text
        });
        await msg.save();
        console.log("Done");
    } catch (e) {
        console.log("An error happened while logging the message: " + e)
    }
}

ここで、メッセージを受信したときにトリガーされ、その処理とデータの取得を行う別の非同期関数があります。この関数がトリガーされるとすぐに、「log_message」を呼び出してデータベースにメッセージを記録しますが、await で呼び出すことはしたくありません。そうしないと、「log_message」関数が返されるまで待ってからメッセージを処理することになり、メッセージ処理が遅くなります。

    async getReply(username, message) {
        log_message("user", username, message);
        console.log("HI");
        let reply = await this.rs.reply(username, message, this);
        return reply;
    }

それにもかかわらず、Jetbrains Webstorm は「非同期関数呼び出しの await がありません」という警告を表示します。ここで、いくつかテストを行いましたが、await なしで関数を呼び出すと、システムは期待どおりに動作し、メッセージが処理され、ログ関数は中断することなく非同期でデータベースにデータを書き込みます。代わりに、ログ関数を呼び出す前に await キーワードを配置すると、データベースへの書き込みが完了するまで、メイン関数のコード実行が中断されます。

async/await キーワードの使用方法に何らかの欠陥があるかどうか教えていただけますか?

ベストアンサー1

ロジックが呼び出しの結果を必要としない場合、これは必要ありませんasync。あなたのケースでは必要ではありませんが、ドキュメンテーションこの警告を有効にすると、次の 2 つの利点が挙げられます。

これは一般的には不要ですが、2つの主な利点があります。1つ目は、コードをtry-catchで囲むときに「await」を追加することを忘れないことです。2つ目は、明示的な「await」があると、V8ランタイムが非同期スタックトレースを提供するのに役立つことです。

おすすめ記事