2014-04-09 18 views
47

Ho una funzione javascript in cui voglio restituire il valore che ottengo dopo il metodo di ritorno. più facile da vedere che spiegarevalore restituito dopo una promessa

function getValue(file){ 
    var val; 
    lookupValue(file).then(function(res){ 
     val = res.val; 
    } 
    return val; 
} 

Qual è il modo migliore per farlo con una promessa. A quanto ho capito, lo return val ritornerà prima che il valore di lookup abbia funzionato, ma l'I non può restituire return res.val come tale solo dalla funzione interna.

+0

@OneKitten, la questione si collega a non è usando una promessa, sta passando una funzione come callback, è molto diverso credo. – pedalpete

+1

È lo stesso concetto, le promesse sono ancora asincrone. –

+1

http://stackoverflow.com/q/22536385/1348195 –

risposta

16

Il modo migliore per farlo sarebbe quello di utilizzare la promessa funzione che restituisce così com'è, come questo

lookupValue(file).then(function(res) { 
    // Write the code which depends on the `res.val`, here 
}); 

La funzione che invoca una funzione asincrona non può aspettare fino alla funzione asincrona restituisce un valore. Perché, invoca semplicemente la funzione asincrona ed esegue il resto del codice al suo interno. Quindi, quando una funzione asincrona restituisce un valore, non sarà ricevuto dalla stessa funzione che lo ha invocato.

Quindi, l'idea generale è di scrivere il codice che dipende dal valore di ritorno di una funzione asincrona, nella funzione asincrona stessa.

+3

Non hai torto, ma la tua soluzione viola il principio di incapsulamento. L'oggetto o la funzione che chiama getValue (...) non dovrebbe sapere e non dovrebbe essere a conoscenza della funzione lookupValue (...). In questo modo, se la procedura esatta all'interno di getValue (...) cambia, le funzioni che si basano su di esso non devono essere aggiornate. –

13

utilizzare un modello in questo senso:

function getValue(file) { 
    return lookupValue(file); 
} 

getValue('myFile.txt').then(function(res) { 
    // do whatever with res here 
}); 

(anche se questo è un po 'ridondante, sono sicuro che il codice attuale è più complicato)