Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJs:$http.get请求在另一个$http.get请求中_Javascript_Angularjs_Http_Jenkins_Q - Fatal编程技术网

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

Javascript AngularJs:$http.get请求在另一个$http.get请求中,javascript,angularjs,http,jenkins,q,Javascript,Angularjs,Http,Jenkins,Q,我对AngularJS非常陌生,而且实际上对编程也比较陌生。基本上,我想从Jenkins请求JSONapi,以获得两个不同文件夹中正在运行的作业的列表。在这些数据中,有一个指向每个工作的url,我也想获取这些工作的数据。因此,我需要为每个作业执行另一个$http.get请求,将url(第一个请求的数据中的一个值)作为参数传递 最初,我有一个请求在另一个请求中,在两个循环中进行迭代 文件夹,以及每个文件夹中的 工作 在做了一些研究之后,我意识到由于$http请求是异步的,而循环是同步的,所以这种方

我对AngularJS非常陌生,而且实际上对编程也比较陌生。基本上,我想从
Jenkins
请求
JSON
api,以获得两个不同文件夹中正在运行的作业的列表。在这些数据中,有一个指向每个工作的url,我也想获取这些工作的数据。因此,我需要为每个作业执行另一个
$http.get
请求,将url(第一个请求的数据中的一个值)作为参数传递

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

  • 文件夹,以及每个文件夹中的
  • 工作
    在做了一些研究之后,我意识到由于
    $http
    请求是异步的,而循环是同步的,所以这种方法是行不通的。所以我有一个服务,它使用
    $q
    ,收集第一个请求的承诺,但我不知道如何使用第一个请求的数据作为第二个请求的参数。有人能帮忙吗?

    对于异步请求,您应该使用
    异步瀑布

    例如:

    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(...);
            }
         );
    

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

    如果我站不住,你需要循环两次。因此,在第一个循环中,调用第一个请求。在这个请求的回调中,您可以为第二个循环输入代码

    e、 g:


    for(var i=0;i因此假设您有两个调用,a和b。它们都返回Jenkins作业列表。您可以使用承诺的
    数组对这些作业进行分组,然后使用
    $q.all(承诺)
    对这些响应进行分组:

    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数组中对调用进行分组
    。然后我们再次使用
    $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.
        }
    }
    
    $q.all(詹金斯承诺)。然后(函数(詹金斯响应){
    var i,j,当前,UrlPromissions=[];
    对于(i=0,j=1.length;i
    无需为此引入另一个库。
    $q
    在您的第一个代码块中已经构建了此功能,
    承诺。push
    詹金斯承诺。push
    ?正确,我在稍后阶段更改了名称,我的坏!
    $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.
        }
    }