Angular:在我在控制器中设置返回值之前,如何等待服务中的承诺得到解决?

时间:2016-08-10 19:17:09

标签: javascript angularjs service controller promise

我正在使用角度并提供以下服务:

myApp.factory('MyService', ['$http', function ($http) {
    return {
        getData: function (ID) {
            var promise = $http.get('Holdings/GetGridData?Id=' + ID)
            .then(function (response) {
                return response.data;
            });
            return promise;
   }};
}]);

然后我在控制器中使用:

调用它
function createData(ID) {
    MyService.getData(ID).then(function (data) {
        $scope.JsonData = data;
    });

    return $scope.JsonData;
};

然而,当第一次触发CreateData时,它返回undefined,在返回之后,我可以在控制台中看到我可以看到它显示:XHR完成加载:GET“http://localhost:50243/Holdings/GetGridData?Id=2”。

因此,它正确读取数据,但在我的$ scope.JsonData设置为undefined之后。在此之后,当我再次触发事件时,$ scope.JsonData正确地设置为数据。我的问题是,在第一次触发事件时,如何在设置值之前让控制器等待服务中的承诺得到解决?

4 个答案:

答案 0 :(得分:0)

我担心这是不可能的。你为什么不喜欢控制器中的承诺方法?

首次调用该函数将返回undefined。同时,承诺得到解决,价值在范围内设定,这会触发$ digest循环。

答案 1 :(得分:0)

您在承诺之前返回response.data,而您实际上并未从服务中返回http请求。

此外,您不需要在控制器中返回任何内容。实现此目的的最简单方法是从服务返回$ http请求并处理控制器中的响应。

示例:https://jsfiddle.net/bmopcr97/

function AppCtrl($scope, Service) {
  var ID = 123;
  Service.getData(ID).then(function(response) {
    $scope.JsonData = response.data;
  });
}

function Service($http) {
  return {
    getData: function(ID) {
      return $http.get('Holdings/GetGridData?Id=' + ID);
    }
  }
}

答案 2 :(得分:0)

处理此问题的一个好方法是通过路由器的解析器。以下是在角度默认路由器中使用解析器的示例(如果使用ui-router,它会有所不同,但概念是相同的)。

$routeProvider
    .when("/news", {
        templateUrl: "newsView.html",
        controller: "newsController",
        resolve: {
            message: function(messageService){
                return messageService.getMessage();
        }
    }
});

此处,messageService.getMessage()返回一个promise(类似于您的示例函数getData())。如果您在控制器中包含message作为参数,控制器将等待承诺在执行之前得到解决。

答案 3 :(得分:0)

AWSCredentials