2014-07-24 4 views
17

Voglio solo ottenere il valore restituito da setTimeout ma quello che ottengo è un formato di testo intero della funzione?Ottieni valore di ritorno da setTimeout

function x() { 
    setTimeout(y = function() { 
     return 'done'; 
    }, 1000); 
    return y; 
} 

console.log(x()); 
+0

tua sintassi è simile, funzionerà solo ritorno. – Mritunjay

+0

vuoi "fatto" per essere restituito? Come puoi restituire un risultato della funzione, che sarà chiamato 1000 ms più tardi? –

+0

I timeout sono asincroni, quindi non è possibile tornare da essi. (beh, è ​​possibile, ma il valore restituito non va da nessuna parte) – Ferdi265

risposta

29

È necessario utilizzare Promises per questo. Sono available in ES6 ma possono essere polyfilled quite easily:

function x() { 
    var promise = new Promise(function(resolve, reject) { 
    window.setTimeout(function() { 
     resolve('done!'); 
    }); 
    }); 
    return promise; 
} 

x().then(function(done) { 
    console.log(done); // --> 'done!' 
}); 
+0

effettivamente il 'done' nel mio esempio era una promessa che deve essere restituita all'interno di un setTimeout..perché non posso ottenere il deferred.resolve() restituito all'interno di setTimeout. come sarebbe? grazie – Vainglory07

+1

Puoi inserire un esempio più chiaro del tuo codice nella domanda? –

4

Non è possibile ottenere un valore di ritorno dalla funzione passata a setTimeout.

La funzione che ha chiamato setTimeout (x nel tuo esempio) si concluderà l'esecuzione e tornare prima che la funzione si passa alla setTimeout è anche chiamato.

Qualunque cosa tu voglia fare con il valore che ottieni, devi farlo dalla funzione che passi a setTimeout.

Nel tuo esempio, che si dovrebbero scrivere come:

function x() { 
    setTimeout(function() { 
     console.log("done"); 
    }, 1000); 
} 

x(); 
+0

spiegazione bella e precisa! –

1

meglio prendere un callback per la funzione x e tutto ciò che si desidera eseguire dopo che il timeout inviare in quella richiamata compito.

function x (callback) { 
    setTimeout(function() { 
     callback("done"); 
    }, 1000); 
} 

x(console.log.bind(console)); //this is special case of console.log 
x(alert) 
0

Penso che si desidera avere bandiera sapere evento si è verificato o no. setTimeout non restituisce un valore. è possibile utilizzare una variabile per rilevare evento si è verificato o non

var y="notdone"; 
    setTimeout(function() { 
     y="done"; 
    }, 1000); 

È possibile accedere variabile y dopo il timeout si è verificato di sapere fare o no