我正在尝试从API扩展数据。
让我们举个例子。 API将返回:
GET /group/1
{ "id": 1, "items": [1, 2, 3] }
GET /item/1
{ "id": 1, "name: "Item 1" }
我想映射组以展开内部的项目:
{
"id": 1,
"expanded_items": [
{ "id": 1, "name: "Item 1" },
{ "id": 2, "name: "Item 2" },
{ "id": 3, "name: "Item 3" }
]
}
我无法找到如何处理回调以映射嵌套项目:
$http.get("/group/1").then(function(result) {
var group = result.data;
group.items.map(function(itemId) {
$http.get("/item/" + itemid);
// And then... ?
});
});
then
回调不会返回结果。而且我不确定我是否应该从map
函数中填充一系列期货。我应该吗?
答案 0 :(得分:1)
您可以尝试使用$q.all()
。
类似的东西:
$http.get("/group/1").then(function(result) {
var group = result.data;
var itemResponses = [];
group.items.forEach(function(itemId) {
itemResponses.push($http.get("/item/" + itemid));
});
return $q.all(itemResponses);
}).then(function(responseDataArray) {
var expandedObject = {id: 1, expanded_items: []}
responseDataArray.forEach(function(data) {
expandedObject.expanded_items(expanded_expandedObjectdata.result)
});
return expandedObject;
});
(从内存写入,不确定确切的语法。)
答案 1 :(得分:1)
您可以使用.then()
之类的$q.all
链接您的请求,并且您可以使用$http.get("/group/1").then(function(result) {
var group = result.data;
var itemPromises=group.items.map(function(itemId) {
return $http.get("/item/" + itemid);
});
return $q.all(itemPromises).then(function(itemResponses){
return {
"id":1,
"expandedItems":itemResponses
}
});
}).then(function(requiredOutput){
console.log(requiredOutput);
});
。对于您的情况,承诺应链接如下
describe "Popup", ->
it "should open notifications when clicked", ->
($ '.popup#notifications').click()
expect(($ '.popup-box')).toHaveClass 'opened'
答案 2 :(得分:0)
在这种情况下,你应该使用$ q service 。 由于默认情况下$ http是异步的,因此如果数据尚未从服务器到达,它不会阻止执行。 要阻止通话,您必须使用$ q服务。