modificati come commento duplicare Cito: [How do I return the response from an asynchronous call?come assegnare il valore restituito di una promessa a una variabile?
Promises are containers for future values. When the promise receives the value (it is resolved) or when it is cancelled (rejected), it notifies all of its "listeners" who want to access this value.
Questa domanda è su come restituire il valore contenuto nella promessa. La risposta mi è stata utile, perché ha chiarito che non è possibile restituire il valore, piuttosto che accedere al valore entro la funzione di promessa.
Altre fonti utili sull'argomento, qui:
- How do I return the response from an asynchronous call?
- http://www.html5rocks.com/en/tutorials/es6/promises/
- jQuery deferreds and promises - .then() vs .done().
Sotto la domanda iniziale:
la prego di aiutare a capire come ottenere il valore da una promessa e le differenze tra questi due esempi?
//I have a simple ajax call like:
var fetch = function(start_node, end_node) {
var apiEndpoint = 'localhost/nodes/';
var loadurl = apiEndpoint+start_node+'/'+end_node;
return $.ajax({
url: loadurl,
type: 'GET',
dataType: 'json',
jsonpCallback: 'json'
});
};
// Then I processed results in something like:
var getResult = function(data) {
// do smtg with data
var result = {'myobject' : result_from_data}
return result
}
Infine, voglio assegnargli i risultati.
i seguenti lavori, ma penso che spreca il concetto della promessa dal risultato viene assegnato ad una variabile globale dichiarata prima che:
var r;
fetch('val1','val2')
.then(function(data){
r = getResult(data);
})
Invece il seguente assegna la funzione promessa di res
.
var res = fetch('val1','val2')
.done(function(data){
return getResult(data);
})
Potrebbe chiarire come passare il risultante 'myobject'
alla variabile res
, e non la promessa stessa?
Ho anche provato:
var res = $.when(fetch('val1','val2'))
.done(function(data){
return getResult(data);
})
, ma senza successo.
Penso che questo sia un equivoco. Non c'è alcun valore da restituire, finché non è stata effettuata la promessa (evento asincrono). Quale dovrebbe essere più tardi. La domanda quindi è: cosa succederebbe a questa variabile una volta assegnata? Potresti considerare il tuo design in termini di eventi e callback? –
Non puoi fare ciò che stai cercando di fare. Async async: il risultato è semplicemente non disponibile fino a qualche momento dopo LATER, molto tempo dopo che la funzione è già stata restituita. È necessario inserire il codice che utilizza il risultato INSIDE nella funzione di callback di completamento o richiamare alcune funzioni dall'interno di tale callback e passare i dati come argomento. Tutte quelle altre risposte di cui parli te lo dicono anche tu. A quanto pare, semplicemente non ci credi. – jfriend00
Mostraci dove intendi * usare * il 'res' con quella cosa 'mioobject'.Quello che stai cercando di fare è esattamente quello che hai fatto con quella variabile globale 'r' - e in effetti, spreca il concetto di promesse e potrebbe non funzionare in casi limite. Dovresti semplicemente eseguire 'fetch (...) .then (getResult) .then (function (res) {...});' – Bergi