我认为解决方案将涉及某种形式的承诺,尽管我很难理解如何在这种情况下实现承诺。
基本上我有一个返回$ 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请求和循环组成的错误的意大利面条代码?
由于
答案 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(... //获取任务项
你需要吗?否则,在我看来,这是承诺的经典流程/用例。