2015-06-29 17 views
9

Ho una funzione che restituisce una promessa e sto provando ad attenderla da una funzione asincrona. Il problema è che il programma viene completato immediatamente, invece di attendere la promessa.Il nodo esce prima che la funzione asincrona venga completata

asincrone-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"); 

costruire e gestire:

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

Risultato:

awaiting 
passed by the test 

Risolvere subito invece di aspettare che uno secondo non ha alcun effetto:

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

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

    return deferred; 
} 

È interessante notare che, "risolvere" non viene mai stampato, anche se ora è sincrono:

awaiting 
passed by the test 

ho il sospetto un problema del compilatore, ma ho controllato l'output di Babel e abbastanza sicuro, ha fatto compilare la versione sincrona.

Pensavo di poter attendere una promessa da una funzione asincrona. C'è qualcosa che mi manca qui?

risposta

7

Non si sta utilizzando Promise corretto (presupponendo che sia conforme allo standard). Non ha il metodo resolve. Dovresti invece passare una funzione:

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