如何从HTTP成功函数返回数据

时间:2013-09-26 13:14:30

标签: javascript angularjs

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

此功能在服务中。

2 个答案:

答案 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
}