我对AngularJS
真的很陌生,实际上对编程来说相对较新。基本上,我想从JSON
请求Jenkins
api,以获取2个不同文件夹中正在运行的作业的列表。在这些数据中,每个单独的作业都有一个URL,我也想获取数据。所以,我需要为每个作业做另一个$http.get
请求,将url(这是第一个请求的数据中的值)作为参数传递。
最初,我在另一个请求中有一个请求,在一对循环内迭代
经过一些研究后,我意识到由于$http
请求是异步的,并且循环是同步的,因此该方法不起作用。所以我有一个服务,使用$q
收集第一个请求的承诺,但我不知道如何使用第一个请求中的数据作为第二个请求的参数。有人可以帮忙吗?
答案 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(...);
}
);
catch
和finally
方法通常用于这种控制流,称为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.
}
}