2015-09-16 15 views
13

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:

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.

+1

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? –

+3

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

+1

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

risposta

8

Devi usare la variabile globale trucco, o accettare l'uso save-as-a-promessa trucco.

var getStuff = $.when(req1,req2).then(function(data1,data2) { return data1.concat(data2); }); 

//the variable getStuff is now a promise and any .then chained 
//to it will have data1.concat(data2) passed to it as an argument 

getStuff 
    .then(function(data1Data2) { 
    console.log(data1Data2); 
    }); 

//the next time you want to use it, you have to use the same promise-interface with .then 
getStuff 
    .then(function(data1Data2) { 
    console.log(data1Data2); 
    }); 
+0

Grazie! Quindi, l'unico modo per usare la variabile all'interno della promessa stessa. – user305883

+0

Grazie! Quindi è possibile accedere al valore della promessa, solo all'interno della promessa stessa. Un po 'più avanti: @Adam, eseguo 'getStuff .then (funzione (data1Data2) { console.log (data1Data2); }); 'nella console del browser e restituisce sia il valore che la promessa stessa. (ad es .: 'Object {'myobject': result_from_data}, Object {}' Puoi spiegare perché? – user305883

+2

Non restituisce sia il valore che la promessa stessa - quell'istruzione restituisce la promessa (che la console del browser registra) e anche 'console.log' sono i dati, ecco perché vedi due log. Le tue due opzioni sono, come hai detto, usa una variabile globale, o semplicemente memorizza la promessa e accedi sempre ai suoi dati tramite un' .then' – Adam

Problemi correlati