使用AngularJS应用程序(1.4.3)时,我希望控制器调用服务上的方法,该方法应返回布尔值。
在幕后,该服务用于调用$window.confirm(),然后返回结果。我正在尝试切换实现以使用Angular Material的$mdDialog.confirm() API,但这返回了一个承诺。
我遇到的问题是,如果不将控制器中的代码更改为期望一个promise,就无法直接从我的服务返回true或false。将此方法提取到服务中的整个目的是为了将控制器从调用的实现细节中分离出来,我会考虑使用promise (即未来的布尔值)还是直接的布尔值作为实现细节。
下面是一些代码来演示:在控制器中:
function confirmDeleteDevice() {
if (notificationService.confirm('Are you sure you want to delete the device?')) {
deleteDevice();
}
}‘notificationService’中的旧函数:
function confirm(message) {
return $window.confirm(message);
}notificationService中的新函数无法使用上面的控制器代码正常工作:
function confirm(message) {
var confirm = $mdDialog.confirm()
.title(message)
.ariaLabel(message)
.ok('Yes')
.cancel('No');
return $mdDialog.show(confirm).then(function() {
return true;
}, function() {
return false;
});
}在不更改控制器代码以依赖于使用promise的实现细节的情况下,如何从我的服务方法中获取布尔值?上面的代码将始终执行"deleteDevice()“,因为新的notificationService.confirm()将返回未解析的promise,这显然符合if子句的真值。
我绝对不是promise方面的专家,我知道这并不是他们期望的使用方式,但我真的不想把控制器与promise捆绑在一起。鉴于promises的“异步”性质,这有可能吗?
更新:我在发帖前肯定是看了看,什么也没找到,但在“相关问题”提要中有this just showed up,所以我现在看到我的问题是重复的。那里的答案非常有帮助。
发布于 2015-09-05 03:22:45
您还必须使您的条件异步,通过promise链接。
i.e
notificationService.confirm('...').then(function(confirmation){
if(confirmation) {
deleteDevice();
}
});你真的不需要catch和return false,除非你需要真正跟踪返回值,因为dialog已经根据cancel或Ok解析/拒绝了promise,也就是说,不需要下面的块。
.then(function() {
return true;
}, function() {
return false;
});所以
function confirm(message) {
var confirm = $mdDialog.confirm()
.title(message)
.ariaLabel(message)
.ok('Yes')
.cancel('No');
return $mdDialog.show(confirm);
}然后:
notificationService.confirm('...').then(deleteDevice);https://stackoverflow.com/questions/32405179
复制相似问题