Angular 回调或承诺陷阱 return 值
Angular callback or promise to trap return vale
我正在绞尽脑汁试图让它正常工作。我已经尝试过回调和承诺,并且对两者都持开放态度。我使用 Joe Eames 在 Pluralsight class 中提出的 Mean Stack 为我的代码建模。我仍在学习,所以如果我的术语不正确请原谅我的术语,但这是如何使用代码的,如下所示。
我的界面调用 flQuestionCrudCtrl.createQuestion,调用 flQuestionCrud.createNewQuestion,调用 flQuestion.Create。 flQuestion.Create 向写入 mongodb 集合的服务器发出 http post 请求。一切似乎都运行良好,数据已写入数据库,我可以在每个控制台日志的 flQuestionCrud 中看到 return 值。当我尝试读取 flQuestionCrudCtrl 中的“数据”return 参数时,我得到“错误:数据未定义”。我已经尝试了回调和承诺的每一种组合,但无法让它发挥作用。你能看出我做错了什么吗?
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);
},
您的 flQuestionCrud.createNewQuestion()
方法应该 return 使用 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()
return 的内容解决或拒绝它。
这样您就可以按照您的方式访问控制器中的data
:
flQuestionCrud.createNewQuestion(currentQuestionData)
.then(function(data) {
// work with data here
});
或
doWorkAsync()
.then(function(data) {
// work with data here
});
我正在绞尽脑汁试图让它正常工作。我已经尝试过回调和承诺,并且对两者都持开放态度。我使用 Joe Eames 在 Pluralsight class 中提出的 Mean Stack 为我的代码建模。我仍在学习,所以如果我的术语不正确请原谅我的术语,但这是如何使用代码的,如下所示。
我的界面调用 flQuestionCrudCtrl.createQuestion,调用 flQuestionCrud.createNewQuestion,调用 flQuestion.Create。 flQuestion.Create 向写入 mongodb 集合的服务器发出 http post 请求。一切似乎都运行良好,数据已写入数据库,我可以在每个控制台日志的 flQuestionCrud 中看到 return 值。当我尝试读取 flQuestionCrudCtrl 中的“数据”return 参数时,我得到“错误:数据未定义”。我已经尝试了回调和承诺的每一种组合,但无法让它发挥作用。你能看出我做错了什么吗?
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);
},
您的 flQuestionCrud.createNewQuestion()
方法应该 return 使用 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()
return 的内容解决或拒绝它。
这样您就可以按照您的方式访问控制器中的data
:
flQuestionCrud.createNewQuestion(currentQuestionData)
.then(function(data) {
// work with data here
});
或
doWorkAsync()
.then(function(data) {
// work with data here
});