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
будет заполнен данными.
Должен ли я ждать как-то обещание готово/разрешено?
Ответы
Ответ 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 ($$).