2014-09-27 13 views
6

Ich verwende $q, um ein Versprechen um einen Legacy-Callback zu wickeln. Der vorhandene Rückruf hat jedoch keinen zurückzugebenden Wert. Es benötigt eine Erfolgsfunktion ohne Parameter.Erstellen Sie ein AngularJS-Versprechen mit keinem Rückgabewert

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

kann ich keine void Version von resolve in dem AngularJS docs finden. Ich kann einen Dummy-Wert zurückgeben, aber dann könnten Clients auf diesen Dummy-Wert zugreifen, was zu Verwirrung führen würde.

Wie erstelle ich ein AngularJS Versprechen ohne Rückgabewert?

HINWEIS: Die Frage AngularJS promise returning empty object ist komplett anders. Diese Frage gibt einen Wert in der resolve-Funktion zurück.

+0

Nur mit nichts auflösen. 'Deferred.resolve()'? – PSL

+0

@PSL Ist das möglich? Die Doktoren erwähnen es nicht. – metacubed

+1

Ja, Sie können ohne Wert auflösen. Probieren Sie es aus und sehen Sie, was passiert. :) http://plnkr.co/edit/BpYqlg?p=preview – PSL

Antwort

10

Es gibt keinen void Datentyp in JavaScript. Stattdessen verwendet JavaScript den primitiven Typ undefined, der zur Darstellung einer Variablen verwendet wird, der kein Wert zugewiesen wurde.

Eine Methode oder Anweisung, die keinen Rückgabewert hat, gibt undefined zurück. Eine Funktion, die die return-Anweisung nicht verwendet, gibt undefined zurück. Ein Argument, das nicht an eine Funktion übergeben wird, ist undefined.

Ich hoffe, dass Sie beginnen, das konsistente Verhalten von undefined hier zu sehen. So

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

wenn Sie deferred.resolve() Sie undefined als Wert für das Datenargument sind vorbei.

Um genauer Ihre Frage zu beantworten.

"Wie erstelle ich ein AngularJS Versprechen ohne Rückgabewert?"

Um JavaScript-Code zu schreiben, der die Absicht von keinem Rückgabewert für das Versprechen gibt. Du würdest das schreiben.

deferred.resolve(undefined); 

Das macht deutlich, dass es keine beabsichtigten Daten gibt.

Später in Ihrem Rückruf müssen Sie nicht das Datenargument definieren, aber wenn Sie möchten, können Sie.

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

wenn Sie immer keine Daten erwarten, dann ist dies nur tun.

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

Schöne, detaillierte Antwort!Ich hatte den Eindruck, dass das falsche y-Verhalten von "undefined" den internen Vergleichsalgorithmus des "Versprechens" durcheinander brachte :) – metacubed

+0

@metacubed stimmt, aber Angulars promise code berührt nicht den Datenwert, der an den Callback übergeben wird . Hier im Quellcode können Sie sehen, dass "Wert" gerade so übergeben wird, wie es ist. https://github.com/angular/angular.js/blob/master/src/ng/q.js#L447 – cgTag

Verwandte Themen