从$ http回调中对期货进行分组

时间:2016-01-07 08:55:31

标签: angularjs

我正在尝试从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函数中填充一系列期货。我应该吗?

3 个答案:

答案 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服务。