我发现了各种关于$ q,$ q.all和链接的有用帖子/信息,但我没有找到任何关于我确切问题的例子,所以我想知道我是否想要什么要做甚至可能。我需要进行一系列调用,每个调用依赖于前一个但是在中间有一个步骤,系列分成几个相似之处。它的要点是这样的:
call #1: get keyword (based on inputs)
call #2: with keyword, get list of items
call #3: with item ID#s, get item profiles
call #4: with data in profiles, get item images
(我知道,我知道,只有一个的四个电话是荒谬的,更不用说总共十六个电话,但这是一个原型。我不需要超速。我只需要证明我可以得到使用现有数据/调用进行最后一步。)
无论如何,这意味着#1是对所有人的一次通话......然后从#2开始,它会分开,我必须为每个不同的ID做#2,#3和#4# #1回归。我用jsonplaceholder嘲笑了一个插件。它应该检索第一个集合,然后使用检索到的ID执行接下来的两个调用,每个ID一个循环。
我尝试过一个简单的for循环(Plunker告诉我,我不能用它做一个函数)。我已经尝试过angular.forEach(在$ scope.watch内部和它之外),但这似乎没有给我任何东西:
angular.forEach($scope.resultsb, function(value, key) {
console.log(key + ': ' + value);
$http.get('http://jsonplaceholder.typicode.com/users?id='+ value)
.then(function(res2){
$scope.data2 = res2.data;
var obj = {
title: $scope.results1[i].title,
id: $scope.data2[i].id,
username: $scope.data2.username
};
$scope.results2.push(obj);
我认为forEach只是没有正确地使用b / c它直到我得到$ scope.results1(第一步的结果)之后它才能真正运行,但是我可以将$ http链接链接到循环吗?
你可以在http://plnkr.co/edit/CjXt7E?p=preview看到完整的东西(在当前版本中,可能会在我继续击败之后发生变化)。我正在尝试甚至是可能的,还是我必须长期做这件事?
答案 0 :(得分:0)
你的每个人都会在没有响应的情况下运行,因为它是异步的,而是在你得到回调函数时调用它.then()
编辑你的傻瓜:http://plnkr.co/edit/mxvvCB?p=preview
像这样:$scope.Call = function(value) {
if(typeof value[$scope.counter] !== 'undefined'){
value = value[$scope.counter].id;
var i =$scope.counter;
console.log(value+' ' +i);
$http.get('http://jsonplaceholder.typicode.com/users?id='+ value)
.then(function(res2){console.log(res2);
$scope.data2 = res2.data;
var obj = {
title: $scope.results1[i].title,
id: $scope.data2[0].id,
username: $scope.data2.username
};
$scope.results2.push(obj);
$scope.counter++;
$scope.Call($scope.resultsb);
});
}
};
我希望这是你想要实现的目标。
答案 1 :(得分:0)
我认真工作。
这可能是功能使用最糟糕的情况,但它有效,我得到了结果。不完全 - 我认为一些电话会超时,所以我想出了我需要要求的,比如6,然后我至少得到了我想要的4个结果。这可能表明这种情况迫切需要单个端点而不是在前端执行逻辑,但它足以用于原型,所以我很高兴(现在)。
在我的控制器中,我得到第一组ID,并使用一个简单的for循环,我为每个分配一个循环id。然后我调用getUser(),使用num(将信息连接到第一组结果)和id(连接到实际用户I' m)。这是其内部链的功能:
function getUser(num, id) {
$http.get('http://jsonplaceholder.typicode.com/users?id='+ id)
.then(function(res2){
$scope.data2 = res2.data;
if ($scope.data2[0].username !== 'undefined') {
var obj = {
num: $scope.results1[num].num,
id: $scope.results1[num].id,
title: $scope.results1[num].title,
username: $scope.data2[0].username
};
$scope.results2.push(obj);
}
return $http.get('http://jsonplaceholder.typicode.com/comments?id=' + id);
}).then(function(res3){
if ($scope.results2[num].username !== 'undefined') {
$scope.data3 = res3.data;
var obj = {
num: num,
id: $scope.results2[num].id,
title: $scope.results2[num].title,
username: $scope.results2[num].username,
email: $scope.data3[0].email
};
$scope.results3.push(obj);
}
});
}
您可以在http://plnkr.co/edit/CjXt7E?p=preview看到整个事物 - 它显示每个步骤的输出(results1,results2,results3)。希望我不必再做一些疯狂的事情,但为了以防万一,也许这会对某人有所帮助。或者它可能会让某人跳起来告诉我我做错的一切,但那也没关系。得以某种方式学习。 :)