2016-06-09 65 views
0

我正在试图让这个工作正常。我已经尝试过回调和承诺,并且对两者均开放。我使用Joe Eames在Pluralsight类中制定的Mean Stack来模拟我的代码。我仍然在学习,所以如果不正确,请原谅我的术语,但这里是如何与代码一起工作的,如下图所示。角度回调或承诺陷阱返回价格

我的界面调用flQuestionCrudCtrl.createQuestion,调用flQuestionCrud.createNewQuestion调用flQuestion.Create。 flQuestion.Create向写入mongodb集合的服务器发出http post请求。似乎一切正常,数据写入数据库,我可以看到每个控制台日志flQuestionCrud中的返回值。当我尝试读取flQuestionCrudCtrl中的“data”返回参数时,“错误:数据未定义”。我已经尝试了回调和承诺的每一个组合,但不能让它工作。你能看到我做错了什么吗?

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

你得到当你试图将“未定义”错误将数据记录在doWorkAsync函数的'then'部分中? – user2085143

+0

是的,第198行是当时我尝试显示语句的第二条日志语句。第一个日志语句显示未定义。下面是第一条日志语句的输出,然后是错误。前 - flQuestion.create flQuestionCrud.js:4:13 flQuestionCrud - 之前调用创建flQuestionCrud.js:46:17个 flQuestionCrudCtrl - 成功未定义flQuestionCrudCtrl.js:197:17 错误:数据不确定 $ scope.createQuestion/<@http:// localhost:3030/app/questions/flQuestionCrudCtrl.js:198:17 processQueue @ http:// localhost:3030/vendor/angular/angular.js:14792:28 –

回答

2

flQuestionCrud.createNewQuestion()方法应该返回与data解决的承诺:

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

注意,我们要明确地建立的承诺和解决或拒绝它取决于什么flQuestion.create()回报。

这样你就可以访问你的控制器data你做的方式:

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

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

谢谢,谢谢,谢谢。尴尬地说,我试图让这个工作多久。在所有的阅读和例子中,承诺看起来都像魔术一样,你的解决方案表明这只是我需要接受的幕后魔法。顺便说一句,我在控制器中有没有工作,不知道为什么,但你的建议工作正常。真的很感谢你帮助这个。我会更频繁地伸出手。 –

+1

@ j-terranova,不客气。如果答案解决了您的问题,则应将其标记为“已接受”。 –