2013-05-01 12 views
16

Ho una promessa che sono vincolante nella mia interfaccia utente. Quando la promessa si risolve e il rendering dell'interfaccia utente posso fare clic su quell'elemento dell'interfaccia utente. Nel mio codice controller, dove gestisco il clic, vorrei agire sul valore della promessa. A questo punto nel mio codice angolare so già che la promessa è risolta .. ma quando voglio ottenere il valore è ancora una promessa.Come ottenere il valore di una promessa già risolta?

Qual è il modo migliore per ottenere il valore della promessa ... dato che so che deve essere stato risolto?

risposta

21

Le promesse sono sempre promesse - ed è così che dovrebbero essere. Mentre è possibile legare una promessa direttamente alla vista, generalmente scoraggia questa pratica perché manca di trasparenza e può portare a vedere lo sfarfallio. Una soluzione migliore è quella di assegnare un valore portata in una chiamata then:

myService.then(function(val) { 
    $scope.val = val; 
}); 

Quando $scope.val è pronto, può sempre essere trattati direttamente come valore - perché è.

Detto questo, se si desidera eseguire direttamente l'incarico di promessa, è sufficiente trattarlo come una promessa; cioè, è necessario chiamare promise.then(function() { ... });. Questo sembra un inconveniente, ma in realtà è una testimonianza di quanto siano potenti le promesse.

Se desideri ulteriori informazioni sulle promesse, ho promosso su di loro (e fornito esempi di codice) per un recente Hangout di Google+, in cui ho illustrato i vantaggi, gli usi comuni e le migliori pratiche delle promesse in AngularJS: AngularJS Hangout -- Promises, Promises Promises, Promises. L'idea di catene di promesse senza fine è stata affrontata in modo specifico, anche se non ho un codice di tempo al di sopra della mia testa.

Spero che questo aiuti!

+1

Grazie! Ho seguito il tuo consiglio e ho assegnato la variabile scope alla funzione 'then'. Tutto funziona liscio da lì. Ma sono curioso di sapere se ci sono casi specifici in cui ha senso legarsi direttamente a una promessa ... poiché l'angolare fornisce questa funzionalità. – sthomps

+0

Non sono a conoscenza di casi simili; Penso che la funzionalità sia offerta principalmente per comodità. Ma forse qualcun altro ha un'opinione ... –

+0

Non è sempre utile dare la risposta "non vuoi farlo". Nel mio caso, io sicuramente lo voglio fare perché sto facendo il debug e non ho idea di come ottenere il valore della promessa. Deve essere sicuramente possibile in qualche modo. – Machisuji

0

Ciò che è difficile da capire è che si potrebbe pensare che se la Promessa non è ancora piena, allora forse se aspetto un po 'posso testare di nuovo per vedere se ormai ha un valore. Ma questo non è possibile perché come spiegato in MDN:

"Le chiamate non saranno mai chiamate prima del completamento della corsa corrente del ciclo di eventi di JavaScript."

Finché la funzione attualmente avviata è in esecuzione, la Promessa non può essere piena. Non ha "valore" durante l'esecuzione corrente del ciclo degli eventi. "Promessa" significa "Prometto di dartelo durante l'esecuzione del ciclo di eventi NEXT".

È possibile salvare tale promessa su una variabile globale e quindi quando un utente fa clic su un pulsante nel browser inizia un nuovo ciclo di eventi eseguendo il gestore di eventi che può mettere un altro "quando()" sulla promessa tale che se la promessa viene risolta entro quel tempo, la nuova funzione quando prende il valore ottiene come argomento e la salva in una variabile dalla quale è possibile leggerla. Non c'è bisogno di scriverlo per console, per vedere che è lì.

Questa per me è stata la parte difficile, ho pensato di sì sicuro di poter scrivere Promessa sulla console, ma non riesco a leggere dalla console, quindi come posso ottenere quel valore nel resto del mio programma? Risposta: aspetta che l'attuale ciclo di eventi sia terminato, quindi puoi.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises

Problemi correlati