AngularJs:$http.get 请求包含在另一个 $http.get 请求中
AngularJs: $http.get request inside another $http.get request
我是 AngularJS
的新手,实际上对编程来说还比较陌生。基本上,我想从 Jenkins
请求 JSON
api,以获得 2 个不同文件夹中的 运行 作业列表。在该数据中,每个单独的作业都有一个 url,我也想为其获取数据。因此,我需要为每个作业执行另一个 $http.get
请求,将 url(这是第一个请求数据中的一个值)作为参数传递。
最初,我有一个请求在另一个请求中,在几个循环中迭代
- 文件夹,以及每个文件夹中的
- 职位。
经过一些研究,我意识到由于 $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(...);
}
);
catch
和 finally
方法通常是为这种控制流实现的,称为承诺。值得研究;我个人无法忍受 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.
}
}
我是 AngularJS
的新手,实际上对编程来说还比较陌生。基本上,我想从 Jenkins
请求 JSON
api,以获得 2 个不同文件夹中的 运行 作业列表。在该数据中,每个单独的作业都有一个 url,我也想为其获取数据。因此,我需要为每个作业执行另一个 $http.get
请求,将 url(这是第一个请求数据中的一个值)作为参数传递。
最初,我有一个请求在另一个请求中,在几个循环中迭代
- 文件夹,以及每个文件夹中的
- 职位。
经过一些研究,我意识到由于 $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(...);
}
);
catch
和 finally
方法通常是为这种控制流实现的,称为承诺。值得研究;我个人无法忍受 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.
}
}