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

How do you return a boolean value based on the result of a promise?

本文关键字:返回 布尔值 结果 何根 promise      更新时间:2023-09-26

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

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

我遇到的问题是,没有办法直接从我的服务返回true或false,而不改变我的控制器中的代码来期望一个承诺。将此方法提取到服务中的全部目的是使控制器可以从调用的实现细节中分离出来,并且我会考虑使用承诺(即,未来布尔值)而不是直接布尔值作为实现细节。

下面是一些代码来说明:在控制器中:
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;
    });
}

如果不更改控制器代码以依赖于使用承诺的实现细节,我如何从我的服务方法中获得布尔值?上面的代码将始终执行"deleteDevice()",因为新的notificationService.confirm()将返回未解析的承诺,这显然符合if子句的真值。

我绝对不是承诺方面的专家,我知道这并不是他们期望的使用方式,但我真的不想把控制器束缚在使用承诺上。考虑到承诺的"异步"特性,这可能吗?

更新:在我发布之前,我肯定看了一下,没有找到任何东西,但这只是出现在"相关问题"提要中,所以我现在看到我的问题是重复的。这里的答案非常有用。

你也必须使你的条件异步,链接到承诺。

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

,你真的不需要有catch和return false,除非你需要真正跟踪返回值,因为dialog已经根据cancel或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);