2015-12-04 23 views
23

Ho un codice javascript come questo:Ritorno da una promessa allora()

function justTesting() { 
    promise.then(function(output) { 
    return output + 1; 
    }); 
} 

var test = justTesting(); 

ho avuto sempre un valore non definito per il test var. Penso che sia perché le promesse non sono risolte jet ... c'è un modo per restituire un valore da una promessa?

Grazie!

+1

il valore di ritorno di una chiamata 'then()' è di nuovo una promessa, che racchiude il valore restituito. – Sirko

+0

Si ha un errore di sintassi, non penso nemmeno che analizzi. Il test – djechlin

+0

non è definito perché justTesting non restituisce nulla nell'esempio (non hai restituito). Aggiungi un reso e il test sarà definito come una promessa. –

risposta

21

Per utilizzare una promessa, devi chiamare una funzione che crea una promessa o devi crearne una tu stesso. Non è davvero descrivere ciò che problema si sta veramente cercando di risolvere, ma ecco come si creerebbe una promessa da soli:

function justTesting(input) { 
 
    return new Promise(function(resolve, reject) { 
 
     // some async operation here 
 
     setTimeout(function() { 
 
      // resolve the promise with some value 
 
      resolve(input + 10); 
 
     }, 500); 
 
    }); 
 
} 
 

 
justTesting(29).then(function(val) { 
 
    // you access the value from the promise here 
 
    log(val); 
 
}); 
 

 
// display output in snippet 
 
function log(x) { 
 
    document.write(x); 
 
}

Oppure, se si dispone già di una funzione che restituisce un promessa, è possibile utilizzare tale funzione e restituisce la sua promessa:

// function that returns a promise 
 
function delay(t) { 
 
    return new Promise(function(resolve) { 
 
    setTimeout(function() { 
 
     resolve(); 
 
    }, t); 
 
    }); 
 
} 
 

 
function justTesting(input) { 
 
    return delay(100).then(function() { 
 
    return input + 10; 
 
    }); 
 
} 
 

 
justTesting(29).then(function(val) { 
 
    // you access the value from the promise here 
 
    log(val); 
 
}); 
 

 
// display output in snippet 
 
function log(x) { 
 
    document.write(x); 
 
}

20

Quando si restituisce qualcosa da un callback then(), è un po 'magico. Se restituisci un valore, il successivo() viene chiamato con quel valore. Tuttavia, se si restituisce qualcosa di promettente, il successivo() attende su di esso, e viene chiamato solo quando la promessa si risolve (succede/fallisce).

via https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing_asynchronous_actions

+2

Questo è stato incredibilmente utile, grazie. – Hamsterrific

2

Quello che ho fatto qui è che sono tornato una promessa dalla funzione justTesting. È quindi possibile ottenere il risultato quando la funzione viene risolta.

function justTesting() { 
    return promise.then(function(output) { 
    return output + 1; 
    }); 
} 

justTesting().then((res) => { 
    var test = res; 
    // do something with the output :) 
    } 

Spero che questo aiuti!

+0

Cosa accadrebbe se in "// fai qualcosa con l'output" inserisco una dichiarazione di ritorno? Ad esempio: avrei il "JustTesting(). Then ..." all'interno di una funzione genitore. Sarei in grado di restituire un valore all'interno della parte "allora"? – mrzepka

+0

Se si desidera restituire un valore da //, fare qualcosa con l'output, sarà necessario aggiungere un ritorno prima di JustTesing(). Esempio, "return justTesting(). Then ((res) => {return res;}) –

+0

OK, è quello che mi aspettavo, volevo solo assicurarmi :) Grazie! – mrzepka

Problemi correlati