我的工厂似乎没有执行我的$http.get
。这是我的控制器:
app.factory("myService", function($http) {
var myService = {
retrieve: function(id, type) {
var retrievedData = {
device: {},
childDevices: [],
error: {}
};
.
.
.
$http.get(url, headers)
.success(function(data, status) {
// some data post-processing
// some logs
})
.error(function(data, status) {
// some data post-processing
// some logs
});
return retrievedData;
};
return myService;
});
$http.get
中的日志不会打印。
我在某处需要使用promise
,但我看到的大多数示例都直接返回$http.get
。我不想立即返回$http.get
,因为我需要对工厂中的数据进行一些修改,而不是在控制器中。
感谢。
答案 0 :(得分:-1)
因为当您返回retrievedData
时尚未检索到它。这就是你应该使用承诺的原因:
app.factory("myService", function ($http,$q) {
var myService = {
retrieve: function (id, type) {
var deferred = $q.defer();
var retrievedData = {
device: {},
childDevices: [],
error: {}
};
$http.get(url, headers).then(function (data) {
// success do your success things here and return data
deferred.resolve(data);
},
function (err) {
deferred.reject(err);
});
return deferred.promise;
}
};
return myService;
});
//用法
myService.retrive(id,type).then(function(data){
// data retrived
})
答案 1 :(得分:-1)
用于返回来自后端的响应。在代码retrievedData
中,在响应来自后端之前返回。这就是角度使用承诺的原因。所以当响应来自后端时,它执行成功块,成功块使用deferred.resolve(data)
解析承诺。当错误发生时,错误块获取执行并拒绝承诺deferred.reject(err)
。但是当它解析承诺时它会返回响应数据。
服务代码:
app.factory("myService", function ($http,$q) {
var myService = {
retrieve: function (id, type) {
var deferred = $q.defer();
var retrievedData = {
device: {},
childDevices: [],
error: {}
};
$http.get(url, headers).then(function (data) {
// after success this block execute
deferred.resolve(data);
},
function (err) {
//after error this block execute
deferred.reject(err);
});
return deferred.promise;
}
};
return myService;
});
控制器代码:
//calling retrive function
myService.retrive(id,type).then(fucntion(data){
...
})
.catch(function(){
...
})