Javascript 嵌套foreach中的AngularJS$http

Javascript 嵌套foreach中的AngularJS$http,javascript,angularjs,Javascript,Angularjs,我设想一个解决方案将涉及某种形式的承诺,尽管我正在努力弄清楚在这种情况下我将如何实现承诺 本质上,我有一个返回$resource的服务,然后在控制器中使用.query()来获取站点上下文数组。然后,查询回调函数将响应传递给$scope函数($scope.getTaskLists) getTaskLists函数使用angular.forEach()在站点上下文中循环。对于每个循环迭代,它将使用$http返回每个站点上下文中的任何任务列表。使用.success()承诺,每个$http请求为每个循环调

我设想一个解决方案将涉及某种形式的承诺,尽管我正在努力弄清楚在这种情况下我将如何实现承诺

本质上,我有一个返回$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请求和循环组成的杂乱无章的意大利面代码


谢谢

我认为你的工作流程很好。主要问题可能在服务器端

如果您需要所有嵌套资源。只需在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调用返回承诺。success()是在承诺得到解决时激发的函数


希望它对您有所帮助。

您不能更改此调用的后端吗:

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

要让您获得所有信息:

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

你需要什么


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

这篇文章可能会有所帮助:那么,在K个站点的M个任务列表中有N个任务项,您想创建一个任务的平面列表吗?不幸的是,我没有,我正在使用Microsoft SharePoint的REST API,因此无法更改任何后端代码。因此,是的,在我看来,这是正确的way以角度处理许多异步请求。在这种情况下,在检索到所有任务项后触发事件/函数的最佳方式是什么?我不知道如何编写一个承诺,即一旦所有访问都完成了它们的操作链,就执行x。那么您还没有编写代码吗?看看这个小提琴:这是w的一个例子我所做的:我使用deferred.resolve()和deferred=$q.deferer()将调用发送回其父级,它工作起来非常“轻松”