使用angularjs获取多个HTTP GET请求的更清晰的代码

时间:2015-11-04 01:10:55

标签: angularjs rest http-get restangular ngresource

我一直在思考使用angularjs进行HTTP GET REST调用的3种方法。它们是$ 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会使代码更具可读性和可维护性?或者还有其他方法吗?

2 个答案:

答案 0 :(得分:4)

您的问题不在于获取请求,而是更好的编码承诺的方式。您需要做的是创建更多的模块化函数,这些函数能够处理传入的数据,并返回您需要的内容。例如:

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个电话串在一起,因为您提到您需要先前调用的数据来计算下一个的网址。

答案 1 :(得分:3)

$http.get()返回一个承诺。

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

阅读promises

此外,请检查此答案:How to bundle Angular $http.get() calls?