$ promise保证承诺在'then'函数

时间:2016-03-12 18:35:51

标签: javascript angularjs promise angular-resource

我正在使用angular $resource来执行GET操作。我就是这样做的:

var query = {customerid: $stateParams.customerid}    
$resource('api/reports/running_count').get(query).$promise.then(function(value) {
    $scope.runningInstance = value;
});

我也是这样尝试的:

$resource('api/reports/running_count').get(query, function(value) {
    $scope.runningInstance = value;
});

请求返回一个数字。我用chrome的开发者工具检查了响应。请求确实按如下方式发送:

<base-url>/api/reports/running_count?customerid=<id>

响应再次按预期返回一个数字。

但是当我在回调函数中放置一个断点时,value又是一个承诺,而不是一个数字。不知道我做错了什么。

3 个答案:

答案 0 :(得分:1)

当响应是主要的时,$resource服务不起作用。它使用angular.copy将数据复制到$resource对象,angular.copy不会将原始数据复制到对象。它只能制作其他对象属性的深层副本。

来自文档: 1

  

angular.copy

     

创建source的深层副本,该副本应该是对象或数组。

     
      
  • 如果提供了目标,则会删除其所有元素(对于数组)或属性(对象),然后将源中的所有元素/属性复制到该目标。

  •   
  • 如果source不是对象或数组(包括nullundefined),则会返回source

  •   

在您的情况下,源不是对象,而您只获得$promise服务附加到资源对象的$resource属性。

答案 1 :(得分:0)

来自角度示例https://docs.angularjs.org/api/ngResource/service/$resource

var User = $resource('/user/:userId', {userId:'@id'});
User.get({userId:123}, function(user, getResponseHeaders){
  user.abc = true;
  user.$save(function(user, putResponseHeaders) {
    //user => saved user object
    //putResponseHeaders => $http header getter
  });
});

把你的价值放在那里。

答案 2 :(得分:0)

据我所知,如果您想使用query value获取数据,那么服务器获取query value作为字符串。当您从搜索框发送查询时,它很有用。例如,想要按名称或其他东西搜索产品,那么就可以使用。

在服务中:

var query = {productname: '123'}
getProducts: function(query) {
   var getProducts = $resource('/api/products', {}, {
       'get': {method: 'GET', isArray: true}
       });
   return getProducts.get(query);
 }

和服务器端将收到req.query.productname,因此产品名称为string,因此如果需要,您需要将其转换为number

但如果您想通过id查找产品,则应将id作为参数发送,而不是查询完全匹配的,也可以作为字符串发送。

例如在服务中:

getProductById: function(id) {
    var getProductById = $resource('/api/products/:id', {id: '@id'}, {
                    'get': {method: 'GET'}
     });
     return getProductById.get({id: id});
 }

所以服务器端将收到req.params.id