嵌套foreach

时间:2015-05-19 14:53:33

标签: javascript angularjs

我认为解决方案将涉及某种形式的承诺,尽管我很难理解如何在这种情况下实现承诺。

基本上我有一个返回$ resource的服务,然后在控制器中使用.query()来获取站点上下文数组。然后,查询回调函数将响应传递给$ scope函数($ scope.getTaskLists)。

getTaskLists函数使用angular.forEach()循环遍历站点上下文。对于每个循环迭代,它将使用$ http返回每个站点上下文中的任何任务列表。使用.success()保证,每个$ http请求为每个循环调用另一个,这次循环遍历$ http响应(任务列表)。对于每个任务列表,调用另一个$ http请求获取根文件夹,因为我们稍后需要一个参数。此$ http调用的.success()承诺提取参数,然后调用$ scope.getTaskItems,传入各种参数,包括站点上下文和列表ID。

getTaskItems函数然后使用上面的参数向列表发出$ http请求,该请求将返回所有列表项。然后,此处的.success()回调遍历所有项目并将对象推送到任务范围。

最终结构类似于以下几点:

- $resource.query() // get site contexts
  - angular.forEach(sites)
    - $http().success(... // get task lists
      - angular.forEach(taskLists)
        - $http().success(... // get root context
          - $http().success(... // get task items
            - angular.forEach(taskItems)
              - $scope.tasks.push(taskItem) // push task item to $scope

我需要做的是在所有任务项都被推送到$ scope.tasks后运行一些代码。这是否可以使用promises,是否有更好的方法来简化上面的代码,以便它不是由ajax请求和循环组成的错误的意大利面条代码?

由于

2 个答案:

答案 0 :(得分:0)

在我看来,你的角度工作流程很好。主要问题可能出在服务器端。

如果您需要所有嵌套资源。 Juste在你的json中公开它。

在你的情况下,你有类似的东西:

[
 {"id":"1", "name":"siteContext1"},
 {"id":"2", "name":"siteContext2"}
]

可能这种结构适用于所有资源。但在您的具体情况下,您的第一次通话应该满足您的所有需求,而不是只提供有关该资源的一些信息。

你可能需要这样的东西:

[
 {
  "id":"1",
  "tasks":[{
     "id":"1",
     "rootContext": [{...}]
   }],
  "name":"siteContext1",
 },
{
  "id":"2",
  "tasks":[{
     "id":"2",
     "rootContext": [{...}]
   }],
  "name":"siteContext2",
 }
]

如果您无法修改API。然后,根据你的API,你实际上是以一种很好的方式做到这一点...我的拙见。

实际上$ http调用返回promises。 success()是解析promise时触发的函数。

希望它对你有所帮助。

答案 1 :(得分:0)

你不能改变这个叫做的后端:

$ resource.query()//获取网站上下文

得到你所有的:

$ http()。success(... //获取任务项

你需要吗?

否则,在我看来,这是承诺的经典流程/用例。