web-dev-qa-db-ja.com

非同期関数-約束を待たずに待つ

私はasync-awaitを学ぼうとしています。このコードでは-

_const myFun = () => {
    let state = false;

    setTimeout(() => {state = true}, 2000);

    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(state) {
                resolve('State is true');
            } else {
                reject('State is false');
            }
        }, 3000);
    });
}

const getResult = async () => {
    return await myFun();
}

console.log(getResult());
_

なぜ私は出力を得るのですか-

_Promise { <pending> }
_

値の代わりに? getResult()関数はmyFun()関数を待って、約束の値を解決すべきではありませんか?

19
hg_git

Async/awaitを使用している場合、すべての呼び出しでPromisesまたはasync/awaitを使用する必要があります。同期呼び出しから非同期の結果を魔法のように取得することはできません。

最終的な電話は次のとおりである必要があります。

getResult().then(response => console.log(response));

または次のようなもの:

(async () => console.log(await getResult()))()
19
Ben Fortune

理解する必要があるのは、async/awaitはコードを同期的に実行しないことですが、次のように記述してみましょう。

要するに、前にasyncがある関数は、文字通り非同期に実行されるため、キーワード「async」です。そして、「await」キーワードにより、この非同期関数内でそれを使用する行は、実行中にプロミスを待ちます。そのため、行は待機しますが、関数の呼び出し元も「待機」しない限り、関数全体が非同期に実行されます...

より詳細に説明します:関数の前にasyncを配置すると、実際に行われるのは、その関数が返すものが何であってもpromiseを返すようにすることです。関数は非同期で実行され、returnステートメントが実行されると、promiseが戻り値を解決します。

コードの意味:

const getResult = async () => {
    return await myFun();
}

関数「getResult()」は、実行が完了すると解決するPromiseを返します。したがって、getResult()を呼び出す関数に同様に「待機」するように指示しない限り、getResult()関数内の行は非同期に実行されます。 getResult()関数内では、結果を待つ必要があると言うことができます。これにより、getResult()の実行はプロミスを解決するまで待機しますが、getResult()の呼び出し元は、呼び出し元に 'await '。

したがって、解決策は次のいずれかを呼び出すことです:

getResult().then(result=>{console.log(result)})

または、別の関数で使用する場合は、単に「await」を再度使用できます

async callingFunction(){
    console.log(await(getResult());
}
3
Pim_nr_47

これが実際のケースである場合、非同期および待機する意味はありません。

Promise.resolve(3).then(console.log); console.log(4);
4
3

言い換えれば、then()は後続のステートメント(分岐したPromiseの場合でも)よりも分岐して実行されるため、then内に後続のステートメントを配置する必要があります。

Promise.resolve(3).then(_ => { console.log(_); console.log(4); });
3
4

そして、それは本当なので、なぜわざわざ待つ必要があります。だから、非同期と待機が存在する理由をまだ理解していません。

1
ekerner