2016-06-09 10 views
0

Ich bin mein Gehirn versucht, dies richtig funktionieren zu bekommen. Ich habe Rückrufe und Versprechungen versucht und bin offen für beides. Ich habe meinen Code mit dem von Joe Eames in einer Pluralsight-Klasse angelegten Mean Stack modelliert. Ich lerne immer noch so bitte entschuldigen Sie meine Terminologie, wenn sie falsch ist, aber hier ist, wie das mit Code funktioniert, wie unten dargestellt.Angular Callback oder Versprechen, Rücklauf Tal einzufangen

Meine Schnittstelle ruft flQuestionCrudCtrl.createQuestion auf, die flQuestionCrud.createNewQuestion aufruft, die flQuestion.Create aufruft. flQuestion.Create führt eine http-Post-Anfrage an einen Server durch, der in eine mongodb-Sammlung schreibt. Alles scheint gut zu funktionieren, Daten werden in die Datenbank geschrieben und ich kann den Rückgabewert in flQuestionCrud pro Konsolenprotokolle sehen. Wenn ich versuche, den Rückgabeparameter "data" in flQuestionCrudCtrl zu lesen, bekomme ich "Error: data is undefined". Ich habe jede Kombination aus Callback und Versprechen ausprobiert, kann sie aber nicht zum Laufen bringen. Kannst du sehen, was ich falsch mache?

angular.module('app').controller('flQuestionCrudCtrl',function(flConstructDataService, flQuestionDataService, flQuestionCrud, flCachedReferenceData,flCachedQuestions, flAnswer, $scope, $location, $q, flIdentity, flNotifier,$timeout, $state) { 


$scope.createQuestion = function() { 

function doWorkAsync() { 
    return $timeout(flQuestionCrud.createNewQuestion(currentQuestionData), 10); 
} 

doWorkAsync() 
    .then(function(data) { 
     console.log("flQuestionCrudCtrl - Success " + data); 
     console.log("flQuestionCrudCtrl - Success Statement " + data.statement); 
     console.log("flQuestionCrudCtrl - Success Question id " + data._id); 
     currentQuestionData._id = data._id; 
     flQuestionDataService.setNewQuestionId(data._id); 
     console.log("flQuestionCrudCtrl - currentQuestionData._id " + currentQuestionData._id); 
     console.log("flQuestionCrudCtrl - flQuestionDataService.getNewQuestionId() " + flQuestionDataService.getNewQuestionId()); 
     $state.go('questionUpdate'); 
    }) 
    .catch(function(err) { 
     console.log("flQuestionCrudCtrl - Error " + err); 
     $state.go('questionCreate'); 
    }) 
    .finally(); 
}; 

} 


angular.module('app').factory('flQuestionCrud',function($http, $q, $state, $timeout, flQuestion){ 
    return { 
     createNewQuestion: function(newQuestionData) { 
      console.log("Before - flQuestion.create"); 

     function createQuestionDataAsync(questionData) { 
      console.log("flQuestionCrud - Before Call to create ") 
      var returnData; 
      flQuestion.create(questionData, function(data) { 
       console.log("flQuestionCrud - After Call to create ") 
       if (!data){ 
        return Error("Error Creating Data"); 
        //return null; 
       } 
       else { 
        console.log("flQuestionCrud - Try Section - Success " + data); 
        console.log("flQuestionCrud - Try Section - Success Statement " + data.statement); 
        console.log("flQuestionCrud - Try Section - Success Question id " + data._id); 
       } 
       return data; 
      }); 
     } 

     createQuestionDataAsync(newQuestionData); 
    }, 
+0

Sind Sie die ‚undefiniert‘ Fehler bekommen, wenn Ihr versucht, Protokollieren Sie die Daten im 'then' Teil Ihrer doWorkAsync-Funktion? – user2085143

+0

Ja, Zeile 198 ist die zweite Protokollanweisung in dem, wo ich versuche, die Anweisung anzuzeigen. Die erste Protokollanweisung zeigt undefined an. Unten ist die Ausgabe der ersten Log-Anweisung und dann der Fehler. Vor - flQuestion.create flQuestionCrud.js: 4: 13 flQuestionCrud - Vor dem Aufruf erstellen flQuestionCrud.js: 46: 17 flQuestionCrudCtrl - Erfolg undefined flQuestionCrudCtrl.js: 197: 17 Fehler: Daten sind nicht definiert $ scope.createQuestion/<@http: // localhost: 3030/app/fragen/flQuestionCrudCtrl.js: 198: 17 processQueue @ http: // localhost: 3030/anbieter/angular/angular.js: 14792: 28 –

Antwort

2

Ihre flQuestionCrud.createNewQuestion() Methode sollte das Versprechen mit data aufgelöst zurück:

angular.module('app') 
    .factory('flQuestionCrud', function($http, $q, $state, $timeout, flQuestion){ 
     return { 
      createNewQuestion: function(newQuestionData) { 
       var deferred = $q.defer(); 

       flQuestion.create(questionData, function(data) { 
        if (data){ 
         // whatever we resolve the promise with will be passed 
         // to the `then` handler in the controller 
         deferred.resolve(data); 
        } 
        else { 
         deferred.reject("Error Creating Data"); 
        } 
       }); 

       return deferred.promise; 
      } 
      // ... 
     } 
    }); 

Hinweis, wir ausdrücklich das Versprechen zu schaffen und lösen oder es ablehnen zu welcher flQuestion.create() Renditen abhängig.

Auf diese Weise werden Sie auch die data in Ihrem Controller, wie Sie es tun zuzugreifen:

flQuestionCrud.createNewQuestion(currentQuestionData) 
    .then(function(data) { 
     // work with data here 
    }); 

oder

doWorkAsync() 
    .then(function(data) { 
     // work with data here 
    }); 
+0

Danke, danke, Danke. Peinlich zu sagen, wie lange ich versucht habe, dies zur Arbeit zu bringen. In all den Lektüren und Beispielen sahen Versprechungen wie Magie aus und Ihre Lösung zeigte, dass es ein bisschen hinter den Kulissen ist, die ich nur akzeptieren muss. BTW, was ich in der Steuerung hatte, funktionierte nicht, nicht sicher, warum, aber was Sie vorgeschlagen, hat gut funktioniert. Ich weiß es wirklich zu schätzen, dass du dabei geholfen hast. Ich werde öfter erreichen. –

+1

@ j-terranova, gern geschehen. Wenn die Antwort Ihr Problem löst, sollten Sie es als "akzeptiert" markieren. –