2015-09-04 51 views
4

使用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在“相关的问题”饲料,所以我现在看到我的问题是重复的。那里的答案很有帮助。

+1

不,不同步是不是一个实现细节,因为它修改调用了大量的控制流。不,没有办法让布尔超出承诺同步。只要让你的控制器期望异步结果 - 你就可以使它成为一个实现细节,它在同步之下。 – Bergi

回答

2

你将不得不让你的情况异步,链接承诺。

notificationService.confirm('...').then(function(confirmation){ 
    if(confirmation) { 
     deleteDevice(); 
    } 
}); 

,你真的不需要,除非你需要真正跟踪的返回值,因为对话已经解决了/有渔获物和return false拒绝基于取消或确定,即低于块不会承诺被需要。

.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); 
+0

好吧,对,分辨率的布尔部分是非常多余的。所以我正确地猜测,如果不在控制器异步中做代码,没有办法做到这一点?由于执行已经超出了原始调用函数,并且服务中的.then()“回调”无法访问原始调用函数,请更正? – Sean

+0

@肖恩是的你是对的,正确的方法是只通过承诺。 – PSL