2014-09-27 15 views
6

Sto utilizzando $q per racchiudere una promessa attorno a un callback legacy. Tuttavia, il callback esistente non ha un valore da restituire. Ci vuole una funzione di successo senza parametri.Creare una promessa AngularJS senza valore di ritorno

angular.module('MyModule').service('MyService', function() { 
    function initialize() { 
     var deferred = $q.defer(); 
     LegacyFactory.initialize(
      // 'void' Success Callback 
      function() { 
       deferred.resolve (/* WHAT DO I PUT HERE? */); 
      }, 
      // Error Callback 
      function (errorCode) { 
       deferred.reject(errorCode); 
      }); 
     return deferred.promise; 
    } 
}); 

non riesco a trovare una versione di voidresolve nelle AngularJS docs. Posso restituire un valore fittizio, ma i client potrebbero accedere a tale valore fittizio, il che causerebbe confusione.

Come si crea una promessa AngularJS senza valore di ritorno?

NOTA: la domanda AngularJS promise returning empty object è completamente diversa. Questa domanda restituisce un valore nella funzione resolve.

+0

Basta risolvere con niente .. 'deferred.resolve()'? – PSL

+0

@PSL È possibile? I documenti non lo menzionano. – metacubed

+1

Sì, è possibile risolvere senza alcun valore. Basta provare e vedere cosa succede .. :) http://plnkr.co/edit/BpYqlg?p=preview – PSL

risposta

10

Non è presente il tipo di dati void in JavaScript. JavaScript utilizza invece il tipo primitivo undefined utilizzato per rappresentare una variabile a cui non è stato assegnato un valore.

Un metodo o una dichiarazione che non ha alcun valore restituito restituirà undefined. Una funzione che non utilizza l'istruzione return restituirà undefined. Un argomento non passato a una funzione sarà undefined.

Spero che stiate iniziando a vedere il comportamento coerente qui di undefined.

function foo(x) { console.log(x); } 
foo(); // will print undefined 
function zoom() {} 
console.log(zoom()); // will print undefined 

Così, quando si utilizza deferred.resolve() si sta passando undefined come valore per l'argomento dei dati.

Per rispondere in modo più specifico alla domanda.

"Come si crea una promessa AngularJS senza valore di ritorno?"

Per scrivere codice JavaScript che fornisce l'intento di non restituire un valore per la promessa. Scriveresti questo

deferred.resolve(undefined); 

Ciò rende chiaro che non ci sono dati previsti.

In seguito nella richiamata non è necessario definire l'argomento dati, ma se lo si desidera è possibile.

foo().then(function(data){ 
    if(typeof data === 'undefined') { 
      // there is no data 
    } else { 
      // there is data 
    }); 

se sempre aspetta nessun dato, poi basta fare questo.

foo().then(function(){ 
    // handle success 
}); 
+0

Risposta piacevole e dettagliata!Ho avuto l'impressione che il comportamento falso di 'indefinito 'avrebbe compromesso l'algoritmo di confronto interno del' promise' :) – metacubed

+0

@metacubed true, ma il codice promesso da Angulars non tocca il valore di dati passato al callback . Qui nel codice sorgente puoi vedere che 'value' è appena passato così com'è. https://github.com/angular/angular.js/blob/master/src/ng/q.js#L447 – cgTag

Problemi correlati