AngularJs:另一个$ http.get请求中的$ http.get请求

时间:2016-02-23 15:10:24

标签: javascript angularjs http jenkins q

我对AngularJS真的很陌生,实际上对编程来说相对较新。基本上,我想从JSON请求Jenkins api,以获取2个不同文件夹中正在运行的作业的列表。在这些数据中,每个单独的作业都有一个URL,我也想获取数据。所以,我需要为每个作业做另一个$http.get请求,将url(这是第一个请求的数据中的值)作为参数传递。

最初,我在另一个请求中有一个请求,在一对循环内迭代

  1. 文件夹和每个文件夹
  2. 工作。
  3. 经过一些研究后,我意识到由于$http请求是异步的,并且循环是同步的,因此该方法不起作用。所以我有一个服务,使用$q收集第一个请求的承诺,但我不知道如何使用第一个请求中的数据作为第二个请求的参数。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:0)

您应该使用async waterfall https://github.com/caolan/async进行异步请求。

示例:

async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
      // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
    // result now equals 'done'
});

答案 1 :(得分:0)

如果我理解正确,这与我在过去几个月里必须学习的内容相同。基本上,这个:

requestFunction(...)
    .then(function(response)
        {
            nextRequest(...).then(...);
        }
     );

catchfinally方法通常用于这种控制流,称为promises。值得研究;我个人不能忍受AngularJS,但理解它对我的日常工作很重要,这对它来说非常重要。

答案 2 :(得分:0)

如果我发现你需要循环两次。因此,在第一个循环中,您可以调用第一个请求。在此请求的回调中,您可以将代码放入第二个循环。

e.g:

for(var i=0; i<cpt1; cpt1++){ 
    request1.then(function(response1){
       for(var j=0; j<cpt2; cpt2++){
          request2.then(function(response2){
          });
       }
    });
}

答案 3 :(得分:0)

假设你有两个电话,a和b。他们都返回了Jenkins工作列表。您可以使用array of promises对这些进行分组,然后使用$q.all(promises)对这些回复进行分组:

var jenkinsPromises = [];

// You could loop over this part if you have an array of calls for example.
jenkinsPromises.push($http.get{ // call folder one });
jenkinsPromises.push($http.get{ // call folder two });

// Now wait for all calls to finish and iterate over their responses.

$q.all(jenkinsPromises).then(function (jenkinsResponses) {
    // jenkinsResponses is an array with objects
    // each object being a response from Jenkins
}

在上面的示例jenkinsResponses中,您会找到一个合并结果,让我们说“第一层”调用Jenkins。这个数组包含响应对象,正如你所说,它包含你需要调用的URL。

使用与上述相同的做法,您可以将调用分组到promise array。然后我们再次使用$q.all()对他们的回复进行分组。

$q.all(jenkinsPromises).then(function (jenkinsResponses) {
    var i, j, current, urlPromises = [];

    for (i = 0, j = jenkinsResponses.length; i < j; i++) {
        current = jenkinsResponses[i];

        // Push the call to the urlPromises array.
        // Note that this is a dummy call.

        urlPromises.push($http.get{ current.url] };

    }

    $q.all(urlPromises).then(function (urlResponses) {
        // urlResponses contains a result of all calls to the urls.
    }
}