我无法理解 promise 。我有一个函数 $scope.startJob
,调用它时,它会调用 SegmentsService
中的 areThereAvailableSegments
。我的想法是 areThereAvailableSegments
应该返回 true 或 false,这样我就可以在 Controller 中处理这种行为,但不确定如何做到这一点。
areThereAvailableSegments
调用 getSegments()
,它从数据库请求文本段。 getSegments
返回一个 promise ,我试图用 .then
在 areThereAvailableSegments
中处理这个 promise ,但不确定如何传递给 Controller .
这是我的 Segments 工厂,它返回 $resource
对象,segmentsfactory.js
:
angular.module('appApp')
.factory('SegmentsFactory', function ($resource) {
return $resource('http://localhost:3000/api/v1/segments/:id');
});
这是我的 Segments 服务,segmentsservice.js
:
angular.module('appApp')
.service('SegmentsService', function (SegmentsFactory) {
// gets segments from mongo
this.getSegments = function(jobId) {
return SegmentsFactory.query({ job_id: jobId }).$promise;
};
// should return true/false if there are available segments
this.areThereAvailableSegments = function(jobId) {
var dump = [];
// queries for all segments
this.getSegments(jobId)
.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;
}
});
};
});
这是我的 Controller ,main.js
:
$scope.startJob = function() {
if (SegmentsService.areThereAvailableSegments(jobId)) {
console.log('there are available segments, then trigger texteditor');
} else {
console.log('no segments to translate');
}
};
执行时,控制台显示“没有要翻译的段”,因为 SegmentsService
没有返回 true 或 false。
如何解决?
最佳答案
areThereAvailibleSegments
函数也应该返回一个 promise 。
然后在你的 Controller 中你有一个 then case 并且在那里有你的 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;
}
});
};
由于您的成功函数返回 true 或 false,areThereAvailibleSegments
的 promise 将具有该 bool 值。
然后在你的 Controller 中:
SegmentsService.areThereAvailableSegments(jobId).then(function(available){
if (available) {
console.log('there are available segments, then trigger texteditor');
} else {
console.log('no segments to translate');
}
});
关于javascript - 如何将 promise 传递给 AngularJS 中的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32143244/