2016-02-23 4 views
0

Я действительно новичок в AngularJS и фактически относительно новичок в программировании в целом. В принципе, я хочу запросить JSON api от Jenkins, для списка рабочих заданий в 2 разных папках. Внутри этих данных есть URL для каждого отдельного задания, которое я хочу получить для данных. Итак, мне нужно сделать еще один запрос $http.get для каждого задания, передавая URL-адрес (который является значением внутри данных первого запроса) в качестве параметров.

Первоначально я был один запрос внутри другого, внутри пара петель итерировать между

  1. Появятся папки, и в каждой папке
  2. Задания.

После выполнения некоторых исследований, я понял, что из-за $http запросов является асинхронной, и петли синхронизации быть, этот метод не будет работать. Поэтому у меня есть служба, которая, используя $q, собирает обещание первого запроса, но я не знаю, как использовать данные из первого запроса в качестве параметра для второго запроса. Может кто-нибудь помочь, пожалуйста?

ответ

0

Так что у вас есть два вызова, а, б. Они оба возвращают список рабочих мест Дженкинса. Вы можете сгруппировать их с помощью 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, вы найдете комбинированный результат из, позволяет сказать, что «первый слой» вызывает Дженкинс. Этот массив содержит объекты-ответчики, которые, как вы говорите, содержат 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. 
    } 
} 
+0

. В вашем первом блоке кода будет' '' promises.push''' '' 'jenkinsPromises.push'''? – rohan

+0

Правильно, я изменил название на более позднем этапе, мое плохое! – Matthijs

+0

Большое спасибо! Он работает, именно то, что мне нужно! – rohan

0

Вы должны использовать async waterfallhttps://github.com/caolan/async для запроса 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

Не нужно вводить другую библиотеку для этого. '$ q' имеет эту возможность, уже встроенную в – charlietfl

0

Если я понять правильно, это то же самое, что я должен был учиться в течение последних нескольких месяцев. В основном, это:

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

В catch и finally методы часто реализуется для такого рода контроль потока, который называется обещаниями. Это стоит посмотреть; Я лично терпеть не могу AngularJS, но понимание его важно для моей дневной работы, и это очень важно для него.

0

Если я уйду, вам нужно дважды зациклиться. Итак, в первом цикле вы вызываете свой первый запрос. И в обратном вызове этого запроса вы можете поместить код для своего второго цикла.

например:

for(var i=0; i<cpt1; cpt1++){ 
    request1.then(function(response1){ 
     for(var j=0; j<cpt2; cpt2++){ 
      request2.then(function(response2){ 
      }); 
     } 
    }); 
} 
Смежные вопросы