Javascript 如何从HTTP sucess函数返回数据

Javascript 如何从HTTP sucess函数返回数据,javascript,angularjs,Javascript,Angularjs,我试图从$http返回数据。然后函数: if(navigator.onLine){ $http({ method:'GET', url:url, }).success(function(data, status){ localStorage.setItem('abc', JSON.stringify(data)); }).then(function(){ return JSON.parse(localStorage.g

我试图从
$http返回数据。然后
函数:

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数据,但可以从
then
函数中获取
null

并且此功能位于服务内部。

您不能。您需要返回它的承诺,即
方法的结果

同样,您还希望为来自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')) );
}

如果您想在“返回”之前进行一些处理,您可以使用
$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
):


不不要这样做。当您可以使用
.then()
时,不需要另一个
$q.defer()
。这个解决方案实际上是非常错误的,因为它不处理错误。谢谢,它可以工作,但我不明白的是,当我处理返回值时,我得到的是
Object{then:function,catch:function,finally:function}
,但数据在ng中正确显示-repeat@Bergi,我同意它不完整,但是你可以使用defere.reject(err)等来处理这个问题。不过,我想我同意你的解决方案更简单。这对我来说更有意义,但仅此而已。:)@另外,返回值是包含方法的和对象,最重要的是,如
然后
,您只需调用返回的对象并将
函数传递给它即可。当“承诺”实现时,该函数将被调用。当我安慰返回时,我得到
Object{data:Object,status:200,headers:function,config:Object}
@Anenth:Ah,听起来很合理。与
success
回调多个参数不同,
$http
承诺生成一个对象,我们只对
.data
属性感兴趣。调整了我的答案。为什么我们必须返回$http对象?它不需要then块中的return语句就可以工作它不返回
$http
函数,而是返回结果的承诺(实际上甚至不直接返回,因为我们使用
then
转换结果并返回另一个承诺)。承诺的要点是它们的回调将在将来发生(ajax是异步的!您不能从回调中
返回
),但您可以在代码执行时链接转换并传递承诺。
foo().then(function (data) {
  // here data contains your returned JSON parsed object
}