web-dev-qa-db-ja.com

Jsで非同期なしでawaitを使用することは可能ですか

Awaitはes7のすばらしい機能です。

ただし、awaitを使用するたびに、非同期関数を定義してこの関数を呼び出す必要があることがわかりました。

といった

    async function asy(){
        const [resCityGuess,resCityHot,resCityAll]=await Promise.all([
                        this.http.get('api/v1/cities?type=guess'),
                        this.http.get('api/v1/cities?type=hot'),
                        this.http.get('api/v1/cities?type=group')
        ])
        this.cityGuessName=resCityGuess.data.name;
        this.cityGuessId=resCityGuess.data.id;
        this.cityHot=resCityHot.data;
        this.cityAll=resCityAll.data;
    }
    asy.apply(this);

私が欲しいのは、次のような非同期機能なしで使用することです

        // the async function definition is deleted
        const [resCityGuess,resCityHot,resCityAll]=await Promise.all([
                        this.http.get('api/v1/cities?type=guess'),
                        this.http.get('api/v1/cities?type=hot'),
                        this.http.get('api/v1/cities?type=group')
        ])
        this.cityGuessName=resCityGuess.data.name;
        this.cityGuessId=resCityGuess.data.id;
        this.cityHot=resCityHot.data;
        this.cityAll=resCityAll.data;
        // without call fn

関数fnを定義し、このfnを呼び出すことがときどき繰り返されると思うので、状況を最適化することは可能ですか?

非同期なしでawaitを使用できますか?

どうもありがとうございます!

12
曾志强

No。await演算子は、async関数でのみ意味があります。

edit—詳しく説明する:asyncawaitの取引全体は、LISPマクロのようなものと考えることができます。その構文が行うことは、何が起こっているかを言語解釈システムに通知することです。これにより、事実上、周囲のコードの変換をPromise-に統合できます。コールバック要求のベースのシーケンス。

したがって、構文の使用は、.then()などの呼び出しを使用して、明示的なPromiseをコーディングするための暗黙的なショートカットです。ランタイムは、関数がasyncであることを知る必要があります。関数内のasync式は、ジェネレータメカニズムを介してPromiseを返すように変換する必要があります。そして、重複する理由により、関数宣言のasync装飾は、これが実際にはPromiseを返す関数であり、Promiseを処理する必要があることを言語に伝えます。

だから、それは複雑です。 JavaScriptを改善および拡張するプロセスでは、世界中に想像を絶するほど大量のJavaScriptコードが存在するという事実を考慮する必要があります。そのため、ほとんどすべての場合、2002年以降、変更されていないページが機能しなくなることはありません。

13
Pointy