Подтвердить что ты не робот

Почему angular $resource добавляет дополнительные объекты ($ prom, $resolve...) к моему ответу на данные?

Я возвращаю ресурс с URL

    $resource("http://foo.com/bar.json").get().
         $promise.then(function(data){ $scope.result = data}, 
                  function(error){ $scope.msg = "error" } );

Возврат ресурсов

["item1"...."item_n",.....,"$promise", "$resolved", "$get", "$save", "$query", "$remove", "$delete"]

Почему я получаю все эти объекты в своем наборе данных. Я предполагаю, что $prom просто возвращает все это и ждет ответа сервера. Но как только у меня есть ответ сервера, где я могу просто получить данные своего сервера без жаргона Promise?

4b9b3361

Ответ 1

Итак, если кто-то еще спотыкается и не понимает promises/angularjs, вот что происходит. Когда вы используете .then() или .get(), вы получаете обещание и некоторые вспомогательные функции в одном и том же объекте. Это потрясающе, потому что тогда вы не беспокоитесь о том, что вызываемые вызовы определены и доступны ли данные, потому что у объекта обещания всегда есть некоторые свойства. Этот объект содержит ваши необработанные данные в другом объекте внутри. Таким образом, объект обещания вложен, вам просто нужно ссылаться на объект данных, когда данные готовы.

Вот что я делал

     $resource("http://foo.com/bar.json").get().
         $promise.then(function(data){ $scope.result = data}, 
//data is actually a promise object.
                  function(error){ $scope.msg = "error" } );

объект обещания

enter image description here

Обратите внимание, что данные фактически находятся под другим объектом, называемым "данные". Таким образом, в вашем успешном обратном вызове получите только данные, которые вы должны сделать в этом случае: data.data

Ответ 2

Если вы посмотрите на источник angular здесь:

https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L505

В цепочке прототипов ресурса есть метод toJSON, который выполнит это для вас.

Например:

$resource("http://foo.com/bar.json").get(function(res) {
    $scope.result = res.toJSON();
});

Ответ 3

Вам нужно вернуть завернутый результат, например {'result': {'some_key': 'some_val'}} из вашего бэкэнда. Или просто сделайте, как описано выше.

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

Ответ 4

$resource возвращает объект или массив, который будет иметь ваши данные при завершении вызова. Все эти функции помогут вам, а $resource в основном предназначены для операций CRUD. Если вам нужны данные, вам нужно подождать, пока они вернутся, чтобы вы могли использовать обещание. Если вы хотите удалить все эти свойства, вы можете использовать angular.toJson, чтобы преобразовать его в json, но angular делает это для вас при публикации он возвращается к ресурсу или вызову $http, поэтому вам не нужно.

$scope.data = $resource("http://foo.com/bar.json").get();
// $scope.data does not have your data yet, it will be
// populated with your data when the AJAX call completes
...
// later in a call from a save button maybe you can just do
// this to post your changes back:
$scope.data.$save();

Ответ 5

Чтобы автоматически удалить их из каждого запроса, вы можете добавить перехватчик:

angular.module('app').config(config);

config.$inject = ['$httpProvider'];
function config($httpProvider) {
    $httpProvider.interceptors.push(interceptor);
}

interceptor.$inject = [];
function interceptor() {
    return {
        request: (config) => {
            if (config.data) {
                delete config.data.$promise;
                delete config.data.$resolved;
            }
            return config;
        }
    };
}