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

AngularJS с использованием $resource service. Обещание не разрешается с помощью запроса GET

Скажем так:

   services.factory('User', function($resource){
        return $resource('/rest/usersettings/:username', {}, {
            get:    {method: 'GET'},
            update: {method: 'POST'}
        });
    });

Поэтому предполагается, что он будет использоваться следующим образом:

        scope.user = User.get( {username: 'bob'}  );    // GET

        console.log( JSON.stringify(scope.user) )       // {"$promise":{},"$resolved":false} 

Итак, когда я отправляю запрос GET, он идет в порядке, создавая эти ur + params:

http://localhost:9000/rest/usersettings/bob

Вопрос, почему у меня есть: {"$promise":{},"$resolved":false}

Если мой запрос GET возвращает json-response обратно с сервера: {"username":"bob","email":"[email protected]"}, то я ожидаю, что мой scope.user будет заполнен данными.

Должен ли я ждать как-то обещание готово/разрешено?

4b9b3361

Ответ 1

User.get( {username: 'bob'} ) не возвращает ваши фактические данные немедленно. Он возвращает что-то будет хранить ваши данные при возврате ajax. На этом ($promise) вы можете зарегистрировать дополнительный обратный вызов для регистрации ваших данных.

Вы можете изменить свой код на:

   scope.user = User.get( {username: 'bob'}  );    // GET
   scope.user.$promise.then(function(data) {
       console.log(data);
   });

Ответ 2

Вы получите свои данные там, но не сразу. Прочитайте docs на ngResource:

Важно понимать, что вызов метода объекта ресурса $resource немедленно возвращает пустую ссылку (объект или массив в зависимости от IsArray). Как только данные будут возвращены с сервера, существующие ссылка заполнена фактическими данными. Это полезный трюк так как обычно ресурс присваивается модели, которая тогда визуализируется по представлению. Наличие пустого объекта не приводит к рендерингу, как только данные поступают с сервера, тогда объект заселен с данными, и представление автоматически повторно отображает новые данные. Это означает, что в большинстве случаев никогда не приходится писать callback для методов действий.

Ответ 3

Теперь я использую это (кажется, я дублирую этот вопрос)

User.get({
    username: 'bob'
}, function(user) {

    user.$update(
        function(data, headers) {
            console.log("GOOD");
        },
        function(err, headers) {
            console.log("BAD");
        }
    );
});

Ответ 4

Это должно работать:

User.get( {username: 'bob'} ).$promise.then(function(data) {
    scope.user = data.toJSON();
});

toJSON() очищает внутренние свойства Angular ($$).