我正在使用角度并提供以下服务:
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正确地设置为数据。我的问题是,在第一次触发事件时,如何在设置值之前让控制器等待服务中的承诺得到解决?
答案 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