AngularJs:$http.get 请求包含在另一个 $http.get 请求中

AngularJs: $http.get request inside another $http.get request

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

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

  1. 文件夹,以及每个文件夹中的
  2. 职位。

经过一些研究,我意识到由于 $http 请求是异步的,而 for 循环是同步的,所以该方法行不通。所以我有一个服务,它使用 $q 收集第一个请求的承诺,但我不知道如何使用第一个请求的数据作为第二个请求的参数。有人可以帮忙吗?

您应该使用 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'
});

如果我没理解错的话,这就是我在过去几个月里必须学习的东西。基本上,这个:

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

catchfinally 方法通常是为这种控制流实现的,称为承诺。值得研究;我个人无法忍受 AngularJS,但理解它对我的日常工作很重要,这是非常基础的。

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

例如:

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

假设您有两个电话 a 和 b。他们都 return 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 的调用的组合结果,比方说 'first layer'。该数组包含响应对象,正如您所说,包含您需要调用的 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.
    }
}