2

我正在尝试从$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

这个功能在一个服务里面。

4

2 回答 2

5

无法 return响应来自异步调用的响应。你需要为它返回promise,即.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')) );
}
于 2013-09-26T13:18:11.670 回答
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
}
于 2013-09-26T13:27:31.043 回答