我尝试在工厂中使用$http.get()
来检索将在控制器中进一步处理的值。
appFac.factory('CompletedJobs',function($http){
var result;
return{
getJobs : function(webserviceurl){
$http.get(webserviceurl).success(function(data){
result = data;
})
.error(function(err){
result = '';
});
return result;
}
}
})
appCtrl.controller('Ctrl',function(CompletedJobs){
var data = CompletedJobs.getJobs('some url');
// some other logic based on data
});
由于异步,当数据在工厂方法内可用时,它对控制器没用,因为工厂方法已经返回undefined
。
任何人都可以帮我解决如何从工厂方法获取数据,以便控制器可以使用它吗?
答案 0 :(得分:1)
在您的工厂中,您应该返回成功或错误的承诺,而不是显式返回结果,因为这将在您的承诺得到解决之前返回。像这样修改你的工厂。
appFac.factory('CompletedJobs',function($http, $q){
return{
getJobs : function(webserviceurl){
var deferred = $q.defer();
$http.get(webserviceurl).then(function(response){
deferred.resolve(response.data);
return deferred.promise;
});
}
}
})
appCtrl.controller('Ctrl',function(CompletedJobs){
var data = CompletedJobs.getJobs('some url');
// some other logic based on data
});
这应该适合你。
答案 1 :(得分:0)
在工厂返回承诺。
void InitializeB(CrossReference arr[])
{
InitializeBBlock(arr, 0x00, 0x00);
InitializeBBlock(arr, 0x10, 0x00);
InitializeBBlock(arr, 0x20, 0x04);
InitializeBBlock(arr, 0x30, 0x04);
InitializeBBlock(arr, 0x40, 0x00);
InitializeBBlock(arr, 0x50, 0x00);
InitializeBBlock(arr, 0x60, 0x04);
InitializeBBlock(arr, 0x70, 0x04);
InitializeBBlock(arr, 0x80, 0x08);
InitializeBBlock(arr, 0x90, 0x08);
InitializeBBlock(arr, 0xA0, 0x10);
InitializeBBlock(arr, 0xB0, 0x10);
InitializeBBlock(arr, 0xC0, 0x08);
InitializeBBlock(arr, 0xD0, 0x08);
InitializeBBlock(arr, 0xE0, 0x10);
InitializeBBlock(arr, 0xF0, 0x10);
}
void InitializeBBlock(CrossReference arr[], int idxStart, int hexStart)
{
for(int j = idxStart; j < idxStart + 4; j++)
{
int baseIdx = idxStart + 4 * (j - idxStart);
for(int i = 0; i < 4; i++)
{
arr[baseIdx + i].A = i + hexStart;
}
}
}
来自承诺的控制器链。
appFac.factory('CompletedJobs',function($http){
return {
getJobs : function(webserviceurl){
//return the promise
return $http.get(webserviceurl);
}
};