2013-09-26 36 views
2

数据我想从$http.then函数返回值:如何返回从http sucess功能

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值。

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

回答

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'))); 
} 
+0

当我安慰的回报,我得到'对象{数据:对象,状态:200,headers:function,config:Object}' – Anenth

+0

@第十一:啊,听起来很合理。与'success'回调多个参数不同,'$ http'允许产生一个对象,我们只对'.data'属性感兴趣。调整我的答案。 – Bergi

+0

okey明白了! 'data.data.abc'获取数据 – Anenth

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 
} 
+1

不!不要这样做。当你可以使用'.then()'时,不需要另一个'$ q.defer()'。这个解决方案实际上是错误的,因为它不处理错误。 – Bergi

+0

谢谢,它的工作原理,但我不明白的是,当我安慰返回的值我得到'对象{然后:函数,catch:function,finally:function}'但数据正确显示在ng-repeat – Anenth

+0

@Bergi,我同意它不完整,但你可以使用defere.reject(err)等来处理。但是,我认为我会同意你的解决方案更简单。尽管如此,这对我来说更有意义。 :) – Mutahhir