В чем разница между .all() и .one() в Restangular?
В чем разница между этими двумя? Оба, кажется, делают GET/users и извлекают их.
Restangular.one('users').getList().then(function(users) {
// do something with users
});
Restangular.all('users').getList().then(function(users) {
// do something with users
});
Я понимаю, что вы можете сделать это ('users', 123), и он будет извлекать /users/ 123, но без второго аргумента кажется, что это одно и то же. Почему не только один метод в этом случае?
Ответы
Ответ 1
Функция one()
имеет второй аргумент, который принимает идентификатор, например. .one('users', 1)
.
-
one('users', 1).get()
переводится на /users/1
-
all('users').getList()
переводится на /users
В отличие от all()
, one()
обычно не используется с .getList()
без аргумента. Однако, если вы должны были вызвать .one('users', 1).getList('emails')
или .one('users', 1).all('emails').getList()
, то вы должны сделать запрос GET на /users/1/emails
.
Ответ 2
Я предполагаю, что они там, чтобы выразить намерение того, что вы собираетесь делать. Я бы понял это как способ создания URL-адреса, выразив, если вы обращаетесь ко всему ресурсу или к определенному.
В конце концов, они собираются строить и делать запрос GET, но поскольку вы выполняете GET и извлекаете некоторые данные, это не значит, что его следует использовать таким образом.
Пример извлечен из https://github.com/mgonto/restangular/issues/450
getList можно назвать двумя способами. Если он вызывает один элемент, то для получения коллекции требуется подэлемент. В противном случае выбирает коллекцию. Итак, одно и то же:
Restangular.one('places', 123).getList('venues') // GET /places/123/venues
Restangular.one('places', 123).all('venues').getList() // GET /places/123/venues
Как вы можете видеть, более выразительно называть одно ( "места", 123).all( "места" ), чтобы понять, что вы просто хотите, чтобы места, расположенные в области/месте 123.
Возможно, следующий URL-адрес поможет вам:
https://github.com/mgonto/restangular/issues/450
Ответ 3
Недавно я обнаружил разницу между этими методами. Да, оба они делают одинаковые запросы на получение, но результаты, которые вы получите, могут удивить вас (поскольку они меня удивили).
Предположим, что у нас есть метод API/пользователи, который возвращает не строго массив, а что-то вроде этого:
{
"result": [{...}]
}
Таким образом, массив возвращается как значение некоторой поддержки объекта ответа. В этом случае get() и getList() работают по-разному. Этот код работает хорошо:
Restangular.get('users').then(function (response) {...});
Ваш обработчик ответа активируется после получения ответа. Но этот код не работает:
Restangular.all('users').getList().then(function (response) {...});
Обработчик ответа не вызывается, несмотря на то, что запрос завершен кодом состояния 200 и непустым ответом. Консоль браузера не показывает никаких ошибок, а сетевой монитор показывает успешный запрос.
Я тестировал это с помощью Restangular 1.5.2, поэтому, вероятно, это уже исправлено в более новых версиях.