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
}