我正在尝试从$http.then
函数返回数据:
if(navigator.onLine){
$http({
method:'GET',
url:url,
}).success(function(data, status){
localStorage.setItem('abc', JSON.stringify(data));
}).then(function(){
return JSON.parse(localStorage.getItem('abc'));
});
}else{
return JSON.parse(localStorage.getItem('abc'));
}
我能够从else
块获取Json数据,但从null
函数获取then
值。
此功能在服务中。
答案 0 :(得分:5)
你不能 return
the response from an asynchronous call。您需要返回它的承诺,即.then
方法的结果。
同样,您也希望从DOM存储中返回(已经实现的)数据承诺。
if (navigator.onLine){
return $http({
method:'GET',
url:url
}).then(function(response) {
localStorage.setItem('abc', JSON.stringify(response.data));
return response.data;
});
} else {
return $q.when( JSON.parse(localStorage.getItem('abc')) );
}
答案 1 :(得分:0)
如果你想在“返回”之前做一些处理,你可以使用$q
创建另一个承诺,它会是这样的:
var defer = $q.defer();
if(navigator.onLine){
$http({
method:'GET',
url:url,
}).success(function(data, status){
localStorage.setItem('abc', JSON.stringify(data));
}).then(function(){
defer.resolve(JSON.parse(localStorage.getItem('abc')));
});
}else{
defer.resolve(JSON.parse(localStorage.getItem('abc')));
}
return defer.promise;
这样做是因为即使您有$http
电话,您也会返回一致的类型,不再担心您是否需要等待。
在你的来电者中你会做这样的事情(说上面的代码属于方法foo
):
foo().then(function (data) {
// here data contains your returned JSON parsed object
}