首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何等待$http请求的响应,单位为angularjs?

如何等待$http请求的响应,单位为angularjs?
EN

Stack Overflow用户
提问于 2013-08-25 02:35:37
回答 3查看 237.7K关注 0票数 94

我在多个页面中使用来自RESTful服务的一些数据。为此,我使用了angular工厂。因此,我需要从服务器获取数据一次,每次使用定义的服务获取数据时。就像一个全局变量。示例如下:

代码语言:javascript
复制
var myApp =  angular.module('myservices', []);

myApp.factory('myService', function($http) {
    $http({method:"GET", url:"/my/url"}).success(function(result){
        return result;
    });
});

在我的控制器中,我将此服务用作:

代码语言:javascript
复制
function myFunction($scope, myService) {
    $scope.data = myService;
    console.log("data.name"+$scope.data.name);
}

根据我的要求,它对我来说工作得很好。但这里的问题是,当我在我的网页中重新加载时,服务将再次被调用并请求服务器。如果在中间执行一些依赖于“已定义的服务”的其他函数,则会给出类似"something“is undefined的错误。所以我想在我的脚本中等待,直到服务加载完成。我该怎么做呢?在angularjs中有这样做吗?

EN

回答 3

Stack Overflow用户

发布于 2014-07-06 10:59:03

对于不熟悉此功能的人,您还可以使用回调,例如:

在您的服务中:

代码语言:javascript
复制
.factory('DataHandler',function ($http){

   var GetRandomArtists = function(data, callback){
     $http.post(URL, data).success(function (response) {
         callback(response);
      });
   } 
})

在您的控制器中:

代码语言:javascript
复制
    DataHandler.GetRandomArtists(3, function(response){
      $scope.data.random_artists = response;
   });
票数 13
EN

Stack Overflow用户

发布于 2015-07-07 07:25:15

我也遇到了同样的问题,如果这些方法对我有效,那就没有问题了。以下是确实有效的方法……

代码语言:javascript
复制
app.factory('myService', function($http) {
    var data = function (value) {
            return $http.get(value);
    }

    return { data: data }
});

然后使用它的函数是...

代码语言:javascript
复制
vm.search = function(value) {

        var recieved_data = myService.data(value);

        recieved_data.then(
            function(fulfillment){
                vm.tags = fulfillment.data;
            }, function(){
                console.log("Server did not send tag data.");
        });
    };

该服务并不是那么必要,但我认为这是一个很好的可扩展性实践。你需要的大部分东西都可以用在其他地方,尤其是在使用API的时候。无论如何,我希望这能对你有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-11-12 06:31:03

仅供参考,这是在使用Angularfire,因此对于不同的服务或其他用途,它可能会有所不同,但应该可以解决相同的isse $http。我有同样的问题,唯一适合我的解决方案,最好的是将所有服务/工厂组合成一个范围内的单一承诺。在需要加载这些服务/等的每个路由/视图上,我将需要加载数据的任何函数放在控制器函数中,即myfunct()和主app.js

代码语言:javascript
复制
myservice.$loaded().then(function() {$rootScope.myservice = myservice;});

在我看来我就是这么做的

代码语言:javascript
复制
ng-if="myservice" ng-init="somevar=myfunct()"

在第一个/父视图元素/包装器中,以便控制器可以运行其中的所有内容

代码语言:javascript
复制
myfunct()

无需担心异步承诺/订单/队列问题。我希望这能帮助那些和我有同样问题的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18421830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档