Angularjs $ resource和$ http同步调用?

时间:2014-04-08 20:17:21

标签: json angularjs http rest asynchronous

我希望使用$http.get方法编写两个服务,使用$resource

编写一个服务

此服务应该接收一个Json对象并且看起来像这样,此时此代码直接在我的控制器中,而不是在服务中:

 var csvPromise= $http.get(base_url + 'DataSource/1').success(function(data) {
     $scope.data4=JSON.stringify(data);
 });

问题是,我希望在$scope.data4中保存收到的数据,我希望在$http.get调用后使用此数据,但该值为空。

此调用后直接指向需要此值的对象:

new myObject($scope.data4) 

所以myObject必须等待很长时间才能到达数据。

或者我可以与$http$resource进行同步通话吗?

我该怎么做?我找到了很多promise.then的例子,但没有任何对我有用。

编辑:我现在已经写了一个服务,但它没有用:

 var test=angular.module('myApp.getCSV', ['ngResource']);
 test.factory('getCSV',function($log, $http,$q, $resource){
     return {
         getData: function (id) {
             var csvPromise= $http.get(base_url +'DataSource/'+id)
                 .success(function(data) {
                 return data;
             });
                 return csvPromise;
         }
     }
 });

然后在我的控制器中我称之为:

 getCSV.getData(1).then(function(theData){
         $scope.data4=JSON.stringify(theData);
         new myObject( $scope.data4); });

但这不起作用。我想如果$http.get收到数据,那么就会调用then函数。

3 个答案:

答案 0 :(得分:1)

我不相信你可以做同步通话。也就是说,您至少有两个选择:

1)使用$routeProvider resolve功能传入数据。来自文档:

An optional map of dependencies which should be injected into the controller. If any of these dependencies are promises, the router will wait for them all to be resolved or one to be rejected before the controller is instantiated. If all the promises are resolved successfully, the values of the resolved promises are injected

关于如何使用它的示例:

$routeProvider
  .when('/your/path', {
    templateUrl: '/app/yourtemplate.html',
    controller: 'yourController',
    resolve: {
      data: ['$route', '$http', function($route, $http) {
        return $http.get(base_url +'DataSource/1');
      }]
    }
  })

然后在你的控制器中:

app.controller('yourController', ['$scope', 'data', function($scope, data) {
  $scope.data4 = JSON.stringufy(data);
  var yourObj = new myObject($scope.data4);
}]);

2)第二个选项是使用promises,只有在promise成功完成后才会实例化new myObject($scope.data4)

答案 1 :(得分:0)

您的代码需要稍微修改一下:

$scope.data4 = '';

var csvPromise= $http.get(base_url +'DataSource/1');
csvPromise.then(function(data){
    $scope.data4 = JSON.stringify(data);
}, function(data){
    //error handling should go here
    window.alert(data);
});

这应该会让你听到你需要的声音。

答案 2 :(得分:0)

据我所知,sync~无法拨打httpresource。他们在AngularJS核心文件上进行了硬编码:

xhr.open(method, url, true);

你也不想通过阻止浏览器等待数据到达来伤害你的用户。您将更好地展示如何使没有任何对我有用,以便我们可以开始努力解决它。

您是否尝试在new myObject($scope.data4)方法中调用success

$http.get(...).success(function(data){
    $scope.data4 = JSON.stringify(data); // I've no idea why do you need this.

    var stuff = new myObject($scope.data4); // THis is now your.
});