使用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”:在notificationService与控制器预计将无法正常工作
function confirm(message) {
return $window.confirm(message);
}
新功能以上代码:
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;
});
}
没有c挂起控制器代码依赖使用承诺的实现细节,我如何从我的服务方法中获得布尔值?上面的代码将始终执行“deleteDevice()”,因为新的notificationService.confirm()将返回未解析的promise,这显然有资格作为if子句的真值。
我绝对没有承诺的专家,我知道这不完全是他们预期的使用方式,但我真的宁愿不把控制器绑在使用承诺上。鉴于承诺的“异步”性质,这甚至有可能吗?
更新:我绝对看过之前,我发布,可以找到什么,但this just showed up在“相关的问题”饲料,所以我现在看到我的问题是重复的。那里的答案很有帮助。
不,不同步是不是一个实现细节,因为它修改调用了大量的控制流。不,没有办法让布尔超出承诺同步。只要让你的控制器期望异步结果 - 你就可以使它成为一个实现细节,它在同步之下。 – Bergi