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


person user2906759    schedule 20.03.2014    source источник


Ответы (3)


Функция 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.

person lyschoening    schedule 20.03.2014

Я предполагаю, что они там для выражения намерения того, что вы собираетесь сделать. Я бы понял это как способ создания URL-адреса, указывающего, обращаетесь ли вы ко всему ресурсу или к конкретному.

В конце концов, они собираются построить и выполнить запрос GET, но поскольку вы выполняете GET и извлекаете некоторые данные, это не означает, что их следует использовать таким образом.

Пример извлечен из https://github.com/mgonto/restangular/issues/450.

getList можно вызывать в обоих направлениях. Если он вызывается в элементе one, то ему нужен подэлемент, чтобы попасть в коллекцию. В противном случае он извлекает коллекцию. Итак, следующее то же самое:

Restangular.one('places', 123).getList('venues')        // GET /places/123/venues
Restangular.one('places', 123).all('venues').getList()  // GET /places/123/venues

Как видите, более выразительно вызвать one('places', 123).all('venues') , чтобы понять, что вам просто нужны места, расположенные в области/месте 123.

Возможно, вам поможет следующий URL:

https://github.com/mgonto/restangular/issues/450

person kitimenpolku    schedule 24.06.2014

Недавно я обнаружил разницу между этими методами. Да, оба они делают одни и те же запросы на получение, но результаты, которые вы получите, могут вас удивить (как они удивили меня).

Предположим, у нас есть API-метод /users, который возвращает не строго массив, а что-то вроде этого:

{
   "result": [{...}]
}

Таким образом, массив возвращается как значение некоторой опоры объекта ответа. В этом случае get() и getList() работают по-разному. Этот код работает хорошо:

Restangular.get('users').then(function (response) {...});

Ваш обработчик ответа вызывается после получения ответа. Но этот код не работает:

Restangular.all('users').getList().then(function (response) {...});

Обработчик ответа не вызывается, несмотря на то, что запрос завершен с кодом состояния 200 и непустым ответом. Консоль браузера не показывает никаких ошибок, а сетевой монитор показывает успешный запрос.

Я тестировал это с Restangular 1.5.2, так что, вероятно, это уже исправлено в более новых версиях.

person sergio    schedule 06.02.2017