首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据promise的结果返回布尔值?

如何根据promise的结果返回布尔值?
EN

Stack Overflow用户
提问于 2015-09-05 03:20:48
回答 1查看 16.1K关注 0票数 4

使用AngularJS应用程序(1.4.3)时,我希望控制器调用服务上的方法,该方法应返回布尔值。

在幕后,该服务用于调用$window.confirm(),然后返回结果。我正在尝试切换实现以使用Angular Material的$mdDialog.confirm() API,但这返回了一个承诺。

我遇到的问题是,如果不将控制器中的代码更改为期望一个promise,就无法直接从我的服务返回true或false。将此方法提取到服务中的整个目的是为了将控制器从调用的实现细节中分离出来,我会考虑使用promise (即未来的布尔值)还是直接的布尔值作为实现细节。

下面是一些代码来演示:在控制器中:

代码语言:javascript
复制
function confirmDeleteDevice() {
    if (notificationService.confirm('Are you sure you want to delete the device?')) {
        deleteDevice();
    }
}

‘notificationService’中的旧函数:

代码语言:javascript
复制
function confirm(message) {
    return $window.confirm(message);
}

notificationService中的新函数无法使用上面的控制器代码正常工作:

代码语言:javascript
复制
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,所以我现在看到我的问题是重复的。那里的答案非常有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-05 03:22:45

您还必须使您的条件异步,通过promise链接。

i.e

代码语言:javascript
复制
notificationService.confirm('...').then(function(confirmation){
     if(confirmation) {
         deleteDevice();
     }
});

你真的不需要catch和return false,除非你需要真正跟踪返回值,因为dialog已经根据cancel或Ok解析/拒绝了promise,也就是说,不需要下面的块。

代码语言:javascript
复制
   .then(function() {
        return true;
    }, function() {
        return false;
    });

所以

代码语言:javascript
复制
function confirm(message) {
    var confirm = $mdDialog.confirm()
        .title(message)
        .ariaLabel(message)
        .ok('Yes')
        .cancel('No');

    return $mdDialog.show(confirm);
}

然后:

代码语言:javascript
复制
notificationService.confirm('...').then(deleteDevice);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32405179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档