2015-05-19 80 views
1

我想象一个解决方案将涉及某种形式的承诺,尽管我很努力地让自己的头脑在这种情况下实现承诺。

本质上我有一个返回$资源的服务,然后我在控制器中使用.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请求和循环组成的意大利面条代码?

谢谢

+1

这篇文章可能有帮助:http://callbackhell.com/ – Jax

+0

因此,K站点中的M任务列表中有N个taskItem,并且您想要创建一个扁平的任务列表? –

回答

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调用返回承诺。 success()是解决promise时触发的函数。

希望它对你有所帮助。

0

不能更改后端由这家名为:

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

,让你所有的:

$ HTTP()。成功(...//获取任务项目

你需要什么?

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

+0

不幸的是,我正在使用Microsoft SharePoint的REST API,因此我无法更改任何后端代码。 –

+0

所以是的,在我看来,这是处理角度中的许多异步请求的正确方法。 – Eagle1

+0

在这种情况下,在检索完所有任务项目后,触发事件/函数的最佳方式是什么?我不确定如何写一个承诺,说一旦所有访问都完成了他们的行动链,那么x。 –