我有以下工厂。它还有一个返回允许时间数组的函数(根据调用返回的信息计算)。我想在模板中提供此信息,如何在控制器中执行此操作?
.factory('Company', function($resource) {
var myCompany = $resource('http://127.0.0.1:3000/api/v1/companies').get();
return {
allowed_times: function(){
myCompany.$promise.then(function(data, status){
var list = new Array();
list[list.length] = moment().set('hour', data.settings.work_time_start).set('minute', 0).set('second', 0);
endTime = moment().set('hour', data.settings.work_time_end).set('minute', 0).set('second', 0);
var currentTime = moment().set('hour', data.settings.work_time_start).set('minute', 0).set('second', 0);
while (list[list.length - 1] < endTime)
{
list[list.length] = moment(list[list.length - 1]).add(data.settings.time_rounding, 'm');
};
return list;
})
}
}
})
我已经尝试过不同的方法,这是最新的,但会给出一条错误信息(无法读取属性'然后'未定义)。
Company.allowed_times().then(function(data) {
$scope.allowed_times = data
})
答案 0 :(得分:3)
如果要将then
方法链接到Company.allowed_times()
调用的结果,allowed_times
必须返回一个promise对象。是的,它不会返回undefined
。修复很简单,您只需要返回myCompany.$promise.then(function() {...})
:
allowed_times: function () {
return myCompany.$promise.then(function (data, status) {
// ... unchanged
return list;
});
}
有一件事:如果你使用then
方法,请记住从中返回,它将成为传递给下一个then
电话的新承诺。
答案 1 :(得分:3)
无需创建额外的延期和承诺(请参阅promise anti-patterns中的Forgotten Promise
)
只需从资源调用中返回承诺:
.factory('Company', function($resource) {
var myCompany = $resource('http://127.0.0.1:3000/api/v1/companies').get();
return {
allowed_times: function(){
//return the promise created by this call
return myCompany.$promise.then(function(data, status){
var list = [];
//populate list with data...
return list;
});
}
}
});