【问题标题】:How to remove $promise and $resolved from json object如何从 json 对象中删除 $promise 和 $resolved
【发布时间】:2018-10-01 20:51:46
【问题描述】:

我在 Angular 中使用 $resource 来获取 json 对象,其结构定义如下

[
    {
        "id": 0,
        "name": "Type1"
    },
    {
        "id": 1,
        "name": "Type 2"
    }
]

获取数据后 ..console.log(jsonObject) 给了我

[Resource, Resource, $promise: Object, $resolved: true]

如何从结果对象中删除 $promise 和 $resolved ? 我尝试了 angular.fromJson(json) 但我仍然看到这些对象仍然存在。

【问题讨论】:

标签: javascript angularjs


【解决方案1】:

我正在寻找相同的答案,但此时我只知道这个丑陋的黑客:

这样写一个函数:

function cleanResponse(resp) {
    return JSON.parse(angular.toJson(resp));
}

并在每个查询中调用它(丑陋,是的):

function getSmt() {
    Resource.get({}, function (data) {
        $scope.some = cleanResponse(data);
    }, function (responce) {
        //handle error
    })
}

如果有人教我如何正确地做,我会很高兴

【讨论】:

  • 是的,如果您需要将纯 json 对象放入(例如)localStorage 中,您可以使用 angular.toJson() 方法
  • 这不是优化的方法。 Promise 对象的原型中已经有 toJSON() 函数。所以你只需要resp.toJSON() 就可以得到没有额外字段的对象。
【解决方案2】:

我的项目示例

Diary.getSharedWithMe(function(data) {
        delete data.$promise;
        delete data.$resolved;
        _self.sharedDiariesWithMe = data;
    }, function(error) {
        console.log(error)
    });

【讨论】:

    【解决方案3】:

    this answer 看来,yourResource.toJSON() 是现成的。

    【讨论】:

      【解决方案4】:

      是的,我多次遇到同样的问题,最后总是使用 $http 而不是 $resource,然而,今天我决定尝试解决这个问题。我希望有一天也有人会发现这很有用。

      所以,当您收到包含 $promise 的对象后,您只需使用 angular.copy(data),如下所示:

      someService.getSomething($scope.someId).$promise.then(function (data) {
          if (data) {
              $scope.dataWithoutPromise = angular.copy(data);
          }
      });
      

      之后,您将看到您的dataWithoutPromise 只包含您需要的对象,而 $promise 和 $resolved 已经消失了。

      【讨论】:

        【解决方案5】:

        我也面临同样的问题。事实上,您只需要使用相同版本的 angular 和 angular-resource,它就会像魅力一样工作。 希望对您有所帮助!

        【讨论】:

        • 这对我没有帮助
        【解决方案6】:

        简答:angular.fromJson(angular.toJson(resp)); 这将删除所有“特定于角度”的函数等,并将返回一个干净的数据对象。

        【讨论】:

          【解决方案7】:

          您是否将isArray.query() 与您的$resource 对象一起使用?

          来自 $resource 文档:isArray – {boolean=} – If true then the returned object for this action is an array.

          更新:

          如果您正确使用$resource,您可以选择:

          1) 让后端返回对象中包含的数据,例如。 { data: [] } 而不仅仅是一个数组。

          2) 如果不可能,请使用来自$resource.query() 的回调,例如。

          MyResource.query({ myParams: 'something'}, function(result) {
              // Do something with the plain result
          });
          

          【讨论】:

          • 我的映射看起来像这样.. { 'get': {method:'GET'}, 'save': {method:'POST'}, 'query': {method:'GET' , isArray:true}, 'remove': {method:'DELETE'}, 'delete': {method:'DELETE'}, 'jsonp': {method:'JSONP'}, 'put': {method:'放'} } );我使用 query() 来获取
          • 我也希望它在 { data : []} 但现在不可能,因为后端已经定义并且我已经使用回调.. var typeService = restService.async(url); typeService({},function(u, getResponseHeaders) { console.log(u); }, function(error) { });你返回 $promise 和 $resource
          • 你能设置一个小提琴吗?
          【解决方案8】:

          我为angular.toJson 做了这个快速可重用的方法(带有前导 $$ 的属性将被剥离):

          yourApp.factory('Service', ['$resource', function ($resource) {
              return $resource('your/rest/api/path');
          }]);
          
           yourApp.factory('commonServices', function () { 
                   return {
                          toJson : function(response){
                              return JSON.parse(angular.toJson(response));
                               //*or* 
                              //return angular.toJson(response);
                          }
              });
          

          然后在你的控制器中像这样:

           yourApp.controller('Controller', ['$scope', 'Service','commonServices',  
          function ($scope, Service, commonServices) {
                      Service.get().then(function (data) {
                          $scope.myData = commonServices.toJson(data);
                      });
                  });
          

          更简单的方法是在控制器中添加angular.toJson

           yourApp.controller('Controller', ['$scope', 'Service',  
          function ($scope, Service, commonServices) {
                      Service.get().then(function (data) {
                          $scope.myData = angular.toJson(data);
                      });
                  });
          

          【讨论】:

            【解决方案9】:

            请简单地这样做:

            jsonObject.$promise = undefined; jsonObject.$resolved = undefined;

            $promise 和 $resolved 不会被删除,但你可以做你想做的事。

            【讨论】:

              【解决方案10】:

              尝试在您的服务中编写类似这样的代码:

              yourApp.factory('Service', ['$resource', function ($resource) {
                  return $resource('your/rest/api/path');
              }]);
              

              然后在你的控制器中像这样:

              yourApp.controller('Controller', ['$scope', 'Service', function ($scope, Service) {
                  Service.get().then(function (data) {
                      $scope.myData = data;
                  });
              });
              

              【讨论】:

              • 这将返回 {$$state: Object} 作为对 json 变量的响应。
              • 实际上它会在作者抱怨时返回$promise: Object, $resolved: true
              猜你喜欢
              • 2015-02-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-07-30
              • 2019-08-22
              • 1970-01-01
              • 2018-03-17
              • 2014-08-23
              相关资源
              最近更新 更多