Javascript 如何在AngularJS中将承诺传递给控制器
我很难理解承诺。我有一个函数$scope.startJob,当调用它时,它会调用SegmentsService中的AreAvailableSegments。其思想是AreTheAvailableSegments应该返回true或false,以便我可以在控制器中处理此行为,但不确定如何执行此操作 AreTheAvailableSegments调用getSegments,从数据库请求文本段。getSegments返回一个承诺,我正在尝试用处理这个承诺。然后在AreTheAvailableSegments中,但不确定如何传递给控制器 这是我的Segments工厂,它返回$resource对象segmentsfactory.js: 这是我的细分服务,segmentsservice.js: 执行时,控制台不显示要转换的段,因为SegmentsService不返回true或falseJavascript 如何在AngularJS中将承诺传递给控制器,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我很难理解承诺。我有一个函数$scope.startJob,当调用它时,它会调用SegmentsService中的AreAvailableSegments。其思想是AreTheAvailableSegments应该返回true或false,以便我可以在控制器中处理此行为,但不确定如何执行此操作 AreTheAvailableSegments调用getSegments,从数据库请求文本段。getSegments返回一个承诺,我正在尝试用处理这个承诺。然后在AreTheAvailableSegmen
如何解决这个问题?没有理由同时使用服务和工厂。删除出厂代码并将该代码移到服务中。至于您的问题,您必须使用$q模块来返回承诺$q
然后,您必须在控制器中处理承诺。没有理由同时使用服务和工厂。删除出厂代码并将该代码移到服务中。至于您的问题,您必须使用$q模块来返回承诺$q 然后,您必须在控制器中处理承诺。函数AreTheAvailableSegments也应返回承诺。 然后在你的控制器中,你有一个then案例,还有你的if else
this.areThereAvailableSegments = function(jobId) {
var dump = [];
// queries for all segments
return this.getSegments(jobId) //Return here
.then(function(segments) {
// dumps segments status in a temp array
for (var i = 0; i < segments.length; i++) {
dump.push(segments[i].status);
}
// returns true if there is an 'available' in the temp array
if (dump.indexOf('available') >= 0) {
return true;
} else {
return false;
}
});
};
函数arethereavailablesegments也应该返回一个承诺。
然后在你的控制器中,你有一个then案例,还有你的if else
this.areThereAvailableSegments = function(jobId) {
var dump = [];
// queries for all segments
return this.getSegments(jobId) //Return here
.then(function(segments) {
// dumps segments status in a temp array
for (var i = 0; i < segments.length; i++) {
dump.push(segments[i].status);
}
// returns true if there is an 'available' in the temp array
if (dump.indexOf('available') >= 0) {
return true;
} else {
return false;
}
});
};
我会这样设置…在你的工厂完成承诺,然后调用控制器中的数据 在您的服务中:
.factory('SegmentsFactory', function ($resource) {
var APIRequest = {};
APIRequest.getSegments = function(id){
segmentsAPI = $resource('http://localhost:3000/api/v1/segments/'+id'', ;
return segmentAPI.get().$promise.then(function(segments){
console.log(segments);
return segments;
});
};
return APIRequest;
}]);
然后在控制器中:
var dump = [];
$scope.startJob = function() {
if (SegmentsService.areThereAvailableSegments) {
APIRequest.getSegments($scope.id).then(function(data){
if (data.error){
//error stuff here
} else {
if (data.segments.length > 0){
for(var i=0; i < segments.length; i++){
console.log(segments);
dump.push(segments[i].status);
}
};
我会这样设置…在你的工厂完成承诺,然后调用控制器中的数据 在您的服务中:
.factory('SegmentsFactory', function ($resource) {
var APIRequest = {};
APIRequest.getSegments = function(id){
segmentsAPI = $resource('http://localhost:3000/api/v1/segments/'+id'', ;
return segmentAPI.get().$promise.then(function(segments){
console.log(segments);
return segments;
});
};
return APIRequest;
}]);
然后在控制器中:
var dump = [];
$scope.startJob = function() {
if (SegmentsService.areThereAvailableSegments) {
APIRequest.getSegments($scope.id).then(function(data){
if (data.error){
//error stuff here
} else {
if (data.segments.length > 0){
for(var i=0; i < segments.length; i++){
console.log(segments);
dump.push(segments[i].status);
}
};
此函数不能返回true或false,因为它不知道调用是否成功。函数的执行方式是在承诺有机会得到解决之前。简而言之,承诺是异步的。这个函数不能返回true或false,因为它不知道调用是否成功。函数的执行方式是在承诺有机会得到解决之前。简而言之,承诺是异步的。原始代码很好,但不建议您使用延迟反模式。dfsq,想知道为什么会使用此反模式吗?原始代码很好,但不建议您使用延迟反模式。dfsq,想知道为什么会出现这种反模式吗?我会改进服务,只返回dump.indexOf'available'>=0;,但另一方面,这是正确的答案。谢谢。我非常喜欢这种方法,非常干净。我会改进服务,只返回dump.indexOf'available'>=0;,但另一方面,这是正确的答案。谢谢。我真的很喜欢这种方式,很干净。
.factory('SegmentsFactory', function ($resource) {
var APIRequest = {};
APIRequest.getSegments = function(id){
segmentsAPI = $resource('http://localhost:3000/api/v1/segments/'+id'', ;
return segmentAPI.get().$promise.then(function(segments){
console.log(segments);
return segments;
});
};
return APIRequest;
}]);
var dump = [];
$scope.startJob = function() {
if (SegmentsService.areThereAvailableSegments) {
APIRequest.getSegments($scope.id).then(function(data){
if (data.error){
//error stuff here
} else {
if (data.segments.length > 0){
for(var i=0; i < segments.length; i++){
console.log(segments);
dump.push(segments[i].status);
}
};