我想象一个解决方案将涉及某种形式的承诺,尽管我很努力地让自己的头脑在这种情况下实现承诺。
本质上我有一个返回$资源的服务,然后我在控制器中使用.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。这是否可以使用承诺,有没有更好的方法来简化上面的代码,使它不是由Ajax请求和循环组成的意大利面条代码?
谢谢
这篇文章可能有帮助:http://callbackhell.com/ – Jax
因此,K站点中的M任务列表中有N个taskItem,并且您想要创建一个扁平的任务列表? –