2015-06-29 3 views
9

Ich habe eine Funktion, die ein Versprechen zurückgibt, und ich versuche, darauf aus einer asynchronen Funktion zu erwarten. Das Problem ist, dass das Programm sofort abgeschlossen wird, anstatt auf das Versprechen zu warten.Knoten beendet vor async Funktion beendet

Asynchron-test.js:

function doItSlow() { 
    const deferred = new Promise(); 

    setTimeout(() => { 
     console.log("resolving"); 
     deferred.resolve(); 
    }, 1000); 

    return deferred; 
} 

async function waitForIt(done) { 

    console.log("awaiting"); 
    await doItSlow(); 
    console.log("awaited"); 
    done(); 
} 

waitForIt(() => { 
    console.log("completed test"); 
}); 

console.log("passed by the test"); 

erstellen und auszuführen:

babel --stage 0 --optional runtime async-test.js > at.js && node at.js` 

Ergebnis:

awaiting 
passed by the test 

Auflösen sofort anstelle einer Sekunde warten, hat keine Wirkung:

function doItSlow() { 
    const deferred = new Promise(); 

    console.log("resolving"); 
    deferred.resolve(); 

    return deferred; 
} 
Interessanter

„Lösung“ wird nie gedruckt, obwohl es jetzt synchron ist:

awaiting 
passed by the test 

Ich würde ein Compiler Problem vermuten, aber ich überprüfte Babels Ausgang und sicher genug, es hat die synchrone Version kompilieren.

Ich dachte, ich könnte nur auf ein Versprechen aus einer asynchronen Funktion warten. Gibt es etwas, das mir hier fehlt?

Antwort

7

Sie verwenden nicht Promise richtig (vorausgesetzt, es ist standardkonform). Es hat keine resolve Methode. Sie sollten stattdessen eine Funktion übergeben:

function doItSlow() { 
    return new Promise(resolve => { 
    setTimeout(() => { 
     console.log("resolving"); 
     resolve(); 
    }, 1000); 
    }); 
}