2014-09-27 18 views
6

Używam obietnicy $q, aby zawrzeć obietnicę wokół starszego wywołania zwrotnego. Jednak istniejące wywołanie zwrotne nie ma wartości do zwrócenia. Wymaga funkcji sukcesu bez parametrów.Utwórz obietnicę AngularJS bez wartości zwracanej

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; 
    } 
}); 

nie mogę znaleźć void wersję resolve w angularjs docs. Mogę zwrócić fałszywą wartość, ale wtedy klienci mogą uzyskać dostęp do tej sztucznej wartości, co może spowodować zamieszanie.

Jak utworzyć obietnicę AngularJS bez wartości zwracanej? UWAGA: Pytanie AngularJS promise returning empty object jest całkowicie różne. To pytanie zwraca wartość w funkcji resolve.

+0

Po prostu rozwiąż z niczym ... 'deferred.resolve()'? – PSL

+0

@PSL Czy to możliwe? Dokumenty o tym nie wspominają. – metacubed

+1

Tak, możesz rozwiązać bez żadnej wartości. Po prostu spróbuj i zobacz, co się stanie .. :) http://plnkr.co/edit/BpYqlg?p=preview – PSL

Odpowiedz

10

Brak typu danych void w JavaScript. Zamiast tego JavaScript używa pierwotnego typu undefined, który jest używany do reprezentowania zmiennej, której nie przypisano wartości.

Metoda lub instrukcja, która nie ma wartości zwracanej, zwróci undefined. Funkcja, która nie używa instrukcji return, zwróci undefined. Argumentem, który nie zostanie przekazany do funkcji, będzie undefined.

Mam nadzieję, że zaczynasz widzieć spójne zachowanie tutaj: undefined.

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

Więc podczas korzystania deferred.resolve() jesteś przejazdem undefined jako wartość argumentu danych.

Aby dokładniej odpowiedzieć na pytanie.

"Jak utworzyć obietnicę AngularJS bez wartości zwracanej?"

Aby napisać kod JavaScript, który daje intencję braku wartości zwrotnej dla obietnicy. Napiszesz to.

deferred.resolve(undefined); 

To wyjaśnia, że ​​nie ma zamierzonych danych.

Później w twoim oddzwonieniu nie musisz definiować argumentu danych, ale jeśli chcesz, możesz.

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

jeśli zawsze oczekiwać żadnych danych, a potem po prostu to zrobić.

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

Ładna, szczegółowa odpowiedź!Miałem wrażenie, że fałszywe zachowanie "nieokreślonego" naruszyłoby wewnętrzny algorytm porównywania "obietnicy" :) – metacubed

+0

@metacubed prawda, ale kod obietnicy Angulars nie dotyka wartości danych przekazywanych do wywołania zwrotnego . Tutaj w kodzie źródłowym widać, że 'value' jest po prostu przekazywane tak jak jest. https://github.com/angular/angular.js/blob/master/src/ng/q.js#L447 – cgTag

Powiązane problemy