Получение более чистого кода для нескольких запросов HTTP GET с помощью angularjs

Я размышлял над тремя подходами к выполнению вызовов HTTP GET REST с помощью angularjs. Это $http, ngResource и restangular. Я остановился на $http, потому что это проще всего и приводит к наиболее читаемому коду. Однако мои вызовы REST усложняются. Мне нужно сделать вложенные запросы HTTP GET и убедиться, что запросы выполняются в правильной последовательности. Вся цепочка запросов HTTP GET останавливается в случае сбоя одного из них.

Код будет выглядеть примерно так;

$http.get(url_get1).success(function(data, status, headers, config)
{
    $http.get(url_get2).success(function(data, status, headers, config)
    {
         $http.get(url_get3).success(function(data, status, headers, config)
         {
             //more action
         }
    }
}

Если цепочка HTTP-запросов становится длинной, код становится нечитаемым.

Сделает ли использование ngResource или restangular код более читабельным и удобным для сопровождения? Или есть другие способы?


person user781486    schedule 04.11.2015    source источник
comment
Если вам нужно убедиться, что ваши вызовы выполняются в определенной последовательности, то я бы хорошо подумал, почему. если вам нужны данные из одного запроса, чтобы решить, как действовать с данными из другого, вытащите их в переменную   -  person Nick Bailey    schedule 04.11.2015
comment
Содержимое переменной необходимо сначала получить из HTTP GET. Итак, я не думаю, что смогу избежать выполнения вызовов в определенной последовательности.   -  person user781486    schedule 04.11.2015
comment
Цепляйте обещания вместо вложения. Делает код намного проще для чтения и обслуживания   -  person charlietfl    schedule 04.11.2015


Ответы (2)


Ваша проблема связана не с запросами на получение, а с лучшими способами кодирования обещаний. Что вам нужно сделать, так это создать больше модульных функций, способных обрабатывать входящие данные и возвращать то, что вам нужно. Например:

function dataFromGetA(data){
    // modify your first get calls data here to the variable, or url you need for the next call
    return $http.get('http://someurl.com/' + data.someKey);
}

function dataFromGetB(data){
    return $http.get('http://someotherurl.com/' + data.somethingElse);
}

Как только вы создадите набор таких функций, их можно легко связать в цепочку, например:

$http.get(firstUrl)
    .then(dataFromGetA)
    .then(dataFromGetB);

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

person Matt Way    schedule 04.11.2015
comment
Еще один отличный ответ, который заслуживает 10 голосов! Похоже, я действительно могу придерживаться $http. - person user781486; 04.11.2015

$http.get() возвращает обещание.

$http.get(url_get1)
   .then($http.get(url_get2))
   .then($http.get(url_get3))

Ознакомьтесь с обещаниями.

Кроме того, проверьте этот ответ: https://stackoverflow.com/questions/15726377/how-to-chain-angular-http-get-calls

person Said Kholov    schedule 04.11.2015
comment
Отличный ответ. Кажется, я могу придерживаться $http. Хотел бы я проголосовать 100 раз. - person user781486; 04.11.2015
comment
Извините, я выбрал другой ответ в качестве ответа. - person user781486; 04.11.2015