【发布时间】:2014-11-18 15:51:18
【问题描述】:
如何使 Angular 服务代码“看起来同步”?
当我清理控制器并将业务逻辑代码放入服务时,我的问题出现了。到目前为止,一切都很好。现在我想在服务函数中“等待”,直到所有异步调用都返回并且 then 返回。我该怎么做?
为了说明我的问题,假设您有一个控制器代码:
- 从后端请求一些数据
- 对数据进行一些处理并
- 将数据交给示波器
这样:
重构前的DataController:
$scope.submitForm = function() {
RestBackend.query('something').then(function(data) {
// do some additional things ...
...
$scope.data = data;
});
};
非常简单。获取数据并填充范围。
重构为控制器+服务后,我最终得到:
DataController 重构:
$scope.submitForm = function() {
DataService.getData().then(function(data) {
$scope.data = data;
});
};
数据服务重构:
this.query = function() {
var dataDefer = $q.defer();
RestBackend.query('something').then(function(data) {
// do some additional things ...
...
dataDefer.resolve(data);
});
return dataDefer.promise;
};
我不喜欢在控制器中也必须使用 Promise 的事实。我喜欢承诺,但我想让控制器不知道服务的这个“实施细节”。这就是我希望控制器代码的样子:
DataController(应该如此):
$scope.submitForm = function() {
$scope.data = DataService.getData();
};
你明白了吗?在控制器中,我不想关心承诺与否。只需等待获取数据然后使用它。因此,我正在寻找一种可能性来实现这样的服务:
- 查询数据(异步)
- 在获取数据之前不要返回
- 返回获取的数据
现在我不清楚第 2 项:我怎样才能“等到数据被提取”然后才继续?目标是服务功能看起来是同步的。
【问题讨论】:
-
您在项目中使用
ngRoute吗? -
我认为你所拥有的是一个非常好的解决方案。您不必等待 promise 被解决,它违背了异步 javascript 的目的。问问自己为什么需要让它运行同步?将我的评论移到答案中
-
@meriadec:是的,我正在使用 ngRoute ...但你为什么要问?
标签: angularjs asynchronous promise angular-promise