2013-05-24 13 views
6

Si consideri il seguente esempio:angular.js non funziona in differita callback

.service('movieGetter', ['$q', '$timeout', function ($q, $timeout) { 
    this.getData = function() { 
     var deferred = $q.defer(); 
     $timeout(function(){ 
      mock.getData(function(data){ 
       deferred.resolve(data); 
      }); 
     }, 2000); 

     return deferred.promise; 
    }; 
}]); 

Per qualche motivo questo codice non funziona, quando la linea deferred.resolve() spara la richiamata in poi nel constroller fa 't

D'altra parte lLa esempio funziona bene:

.service('movieGetter', ['$q', '$timeout', function ($q, $timeout) { 
    this.getData = function() { 
     var deferred = $q.defer(); 
     $timeout(function() { 

      deferred.resolve('test'); 
     }, 2000); 

     return deferred.promise; 
    }; 
}]); 

Fow qualche ragione, quando la deferred.resolve() incendi all'interno di callback poi richiamata per l'constroller non funziona.

Qualche idea?

Grazie!

+0

Quando dici "non funziona" hai un messaggio di errore? In tal caso, puoi aggiornare la domanda con il messaggio? – MaxWillmo

risposta

14

Come sembra, l'API di promessa in angolare fa parte dell'ambito e quindi, quando chiama la risoluzione all'interno di callback angolare non è nel ciclo $ apply ed è inconsapevole della chiamata di funzione.

Per risolvere questo $ scope. $ Apply() deve essere chiamato subito dopo la funzione di risoluzione. Se in servizio e l'iniettabile $ scope non è disponibile, è possibile iniettare invece $ rootScope.

+2

Puoi accettare le tue risposte e dovresti se hanno risolto il problema. – schlingel

+1

Grazie mille, ho lottato con questo per tutta la mattinata! – iamjonesy

+1

quando passo l'ambito e faccio domanda dopo il deferred.resolve (risposta); ottengo: Errore: [$ rootScope: inprog] $ digest già in corso .... Per favore aiuto. – Mike

Problemi correlati