2

我发现 Angular $resource 的行为非常奇怪。请检查以下代码行:

    class Service
        constructor: ($resource) ->
            service = $resource '/record/:id'

            Service::list = (cb) ->
                service.query().$promise.then (data) ->
                    #result: data == [e, $promise: Object, $resolved: true]
                    cb data

            Service::get = (id, cb) ->
                service.get(id:id).$promise.then (data) ->
                    #result: data == {id: 1, name: 'name' ...}
                    cb format data

服务“get”方法返回服务器发送的正确值(对象),但“list”方法作为结果返回数组,其中包含$promise和$resolved...

有没有人有一些逻辑解释?

更新:

我发现了问题。服务结果是字符串数组,其结果是字符串字符数组。这可以通过使用 $http 而不是 $resource 来解决。

前任:

服务器端 -> ['list', 'of', 'elements']

客户端 -> ['l','i','s','t']

4

3 回答 3

5

如果像我一样,您希望您的回复在没有额外 $promise 和 $resolved 属性的情况下为您提供数据,您可以修改资源并添加“拦截器”,如下所述:http: //docs.angularjs.org/guide/迁移#resource-promises-are-resolved-with-the-resource-instance

得到它会是这样的:

var Resource = $resource('/url', {}, {
  get: {
    method: 'get',
    interceptor: {
      response: function(response) {
        // expose response
        return response;
      }
    }
  }
});

然后,您可以在发出 get 请求时访问响应对象而不是资源实例。例如:

Resource.get(function(response){
    angular.forEach(response.data, function(value, key){

    }, $scope.varName);
});

这也意味着您可以访问其他响应属性,例如response.statusresponse.headers以及获取资源的实例response.resource

于 2014-04-02T09:58:42.190 回答
2

但是“list”方法作为结果返回数组,其中包含 $promise 和 $resolved

仔细检查这一点——console.log当数组具有额外属性时,Chrome 在 a 中显示数组的方式具有误导性。例如,在 Chrome 控制台中尝试以下操作:

> a = [1, 2, 3]

> a.$promise = 'thing'

> a.$resolved = true

> a
  [1, 2, 3]

> console.log(a)
  [1, 2, 3, $promise: "thing", $resolved: true]

如您所见,它列出$promise$resolved作为数组的元素,即使它们实际上不在数组中

于 2013-09-02T16:19:50.223 回答
0

文档本身提到了这一点及其用法

Resource 实例和集合具有以下附加属性:

$promise:创建此实例或集合的原始服务器交互的承诺。

成功后,promise 将使用相同的资源实例或集合对象解析,并使用来自服务器的数据进行更新。这使得在 $routeProvider.when() 的 resolve 部分中很容易使用来延迟视图渲染,直到加载资源。

失败时,使用 http 响应对象解决承诺,没有资源属性。

$resolved:第一次服务器交互完成后为真(成功或拒绝),在此之前为假。知道资源是否已被解析在数据绑定中很有用。

于 2013-09-02T15:44:25.690 回答