2014-11-10 25 views
13

Mi dispiace molto se gli altri thread di promessa hanno risposto a questa domanda, ma guardando alcuni di essi non ottengo la risposta per risolvere il mio problema. Ho tre file json che voglio catturare, analizzare e unire manualmente. Il problema è che mi sto bloccando nel carcere di una promessa. Lascia che ti mostri parte del codice dal mio controller angularjs.Ottieni dati da una promessa invece di restituire una promessa

$scope.tests = []; 

$scope.tests = $http.get('results/testResults.json').then(function(res) { 
    return res; 
}); 

console.dir($scope.tests); 

Dal console.dir sto ottenendo una promessa, ma quello che speravo per era il dati dai res variabili. Deve esserci un modo per ottenere quei dati. Non c'è modo di estrapolare i dati dalla promessa a una variabile globale in modo che altre promesse di funzioni possano utilizzare questi dati? Grazie

+1

non si ottengono i dati dai callback, si utilizzano i dati nel callback – dandavis

+0

. Poi() l'ultimo promemoria e il registro della console lì –

+0

Questo è l'esatto modo sbagliato di utilizzare le promesse. Le promesse sono asincrone e stai provando ad usarlo in modo sincrono. – greggreg

risposta

16

La promessa termina in futuro. Stai esaminando la variabile di promessa prima che i dati siano nella promessa. Dovresti rimanere nella catena delle promesse per utilizzare i tuoi dati. Al di fuori della catena delle promesse, non si conoscono i tempi degli eventi asincroni (ecco perché si utilizzano le promesse in primo luogo).

Se davvero non si vuole utilizzare il diritto di dati nel vostro primo .then() gestore, che è il luogo ideale per usarlo, allora è possibile concatenare un altro .then() sulla tua promessa:

$scope.tests = $http.get('results/testResults.json'); 

$scope.tests.then(function(data) { 
    // can use data here 
}); 

FYI, promesse non inserire dati in variabili globali. Rendono i dati disponibili da utilizzare nei callback .then() quando vengono richiamati questi callback.

+0

Inoltre, è necessario eliminare tale mappatura delle identità. – Bergi

+1

Quindi non posso creare un unico oggetto grande e raccogliere i dati da tre file json e unirmi? A me sembra di essere bloccato – jrock2004

+1

@ jrock2004 - devi pensare e scrivere un codice un po 'diverso quando usi operazioni asincrone. È possibile utilizzare altre funzioni promettenti come 'Promise.all()' per coordinare più operazioni asincrone in modo da poter eseguire del codice quando tutti i risultati asincroni vengono eseguiti e utilizzare tutti i risultati. – jfriend00

-2

Make up un una proprietà e incollarla sul oggetto window, come questo,

window.myProperty

Poi passare i dati ad essa, dall'interno della promessa, in questo modo,

window.myProperty = data;

E raccoglierlo, quando si è di nuovo fuori, come questo,

myVariable = window.myProperty;

o viceversa, perché io non riesco a ottenere i dati dentro o fuori di alcune promesse, in modo che sarebbe andato in questo modo,

Anche in questo caso, costituiscono una proprietà e incollarla sull'oggetto finestra, come questo,

window.myProperty

Poi passano i dati ad esso, dall'esterno la promessa, in questo modo,

window.myProperty = dati;

E raccoglierlo, quando si è all'interno, in questo modo,

myVariable = window.myProperty;

Questo non può essere il modo migliore per farlo! Qualcuno sa un modo migliore?

Problemi correlati