使用AngularJS应用程序(1.4.3),我希望控制器调用服务上的方法,该方法应该返回一个布尔值。
在幕后,该服务用于调用$ window.confirm(),然后只返回结果。我正在尝试将实现切换为使用Angular Material' $mdDialog。confirm()API,但这会返回一个承诺。
我遇到的问题是没有办法直接从我的服务返回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子句的truthy值。
我绝对不是承诺的专家,我知道这并不是他们应该如何使用,但我真的不愿意将控制器与使用承诺联系起来。鉴于" async"这是否可行?承诺的本质?
更新:在我发布之前我肯定已经发现并且什么也找不到,但是在{"相关问题&#34}中this just showed up。喂,所以我现在看到我的问题是重复的。答案非常有帮助。
答案 0 :(得分:2)
你也必须让自己的条件同步,并遵守诺言。
即
notificationService.confirm('...').then(function(confirmation){
if(confirmation) {
deleteDevice();
}
});
并且您真的不需要捕获和return false
,除非您需要真正跟踪返回值,因为对话框已经解析/拒绝基于取消或Ok的承诺,即不需要以下块。
.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);