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

В чем разница между .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, но без второго аргумента кажется, что это одно и то же. Почему не только один метод в этом случае?

4b9b3361

Ответ 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, поэтому, вероятно, это уже исправлено в более новых версиях.