wake-up-neo.com

async-Funktion - warten Sie nicht auf das Versprechen

Ich versuche, async-waitit zu lernen. In diesem Code - 

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());

warum bekomme ich die Ausgabe als -

Promise { <pending> }

Anstelle eines Wertes? Sollte die Funktion getResult() nicht warten, bis die Funktion myFun() ihren Versprechenwert auflöst?

15
hg_git

Wenn Sie async/await verwenden, müssen alle Ihre Anrufe Promises oder async/await verwenden. Sie können nicht einfach ein asynchrones Ergebnis von einem Synchronisierungsaufruf erhalten.

Ihr letzter Anruf muss sein:

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

Oder so etwas wie:

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

Was Sie verstehen müssen, ist, dass async/await Ihren Code nicht synchron laufen lässt, sondern Sie ihn so schreiben, als ob er ist:

Kurzum: Die Funktion mit Async davor wird buchstäblich asynchron ausgeführt, daher das Schlüsselwort "async". Und das Schlüsselwort "await" bewirkt, dass die Zeile, die es in dieser asynchronen Funktion verwendet, während der Ausführung auf ein Versprechen wartet. Obwohl die Leitung wartet, wird die gesamte Funktion weiterhin asynchron ausgeführt, es sei denn, der Aufrufer dieser Funktion wartet ebenfalls.

Ausführlicher erklärt: Wenn Sie async vor eine Funktion stellen, bedeutet dies, dass sie ein Versprechen mit dem Inhalt dieser Funktion zurückgibt. Die Funktion wird asynchron ausgeführt, und wenn die return-Anweisung ausgeführt wird, löst das Versprechen den Rückgabewert auf.

Das heißt, in Ihrem Code:

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

Die Funktion "getResult ()" gibt ein Promise zurück, das nach Abschluss der Ausführung aufgelöst wird. Daher werden die Zeilen in der Funktion getResult () asynchron ausgeführt, es sei denn, Sie weisen die Funktion, die getResult () aufruft, an, ebenfalls darauf zu warten. Innerhalb der Funktion getResult () können Sie sagen, dass sie das Ergebnis abwarten muss. Dadurch wartet die Ausführung von getResult () darauf, dass das Versprechen aufgelöst wird. Der Aufrufer von getResult () wird jedoch nicht warten, es sei denn, Sie weisen den Aufrufer an, abzuwarten '.

Eine Lösung wäre also entweder:

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

Oder wenn Sie in einer anderen Funktion arbeiten, können Sie einfach 'wait' erneut verwenden

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

Es ist sinnlos, zu asynchronisieren und abzuwarten, wenn dies der Fall ist:

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

Mit anderen Worten, da das then () sich verzahnt und langsamer läuft als die nachfolgenden Anweisungen (selbst für ein gelöstes Versprechen), müssen wir die nachfolgenden Anweisungen in das then einfügen, wie:

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

Und da das stimmt, warum dann warten? Also ich bin noch nicht zu sehen, warum async und warten sogar existieren.

0
ekerner