你如何 return 基于承诺结果的布尔值?

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

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

在后台,该服务用于调用 $window.confirm(),然后只是 return 结果。我正在尝试将实现切换为使用 Angular Material 的 $mdDialog.confirm() API,但这 return 是一个承诺。

我 运行 遇到的问题是,如果不更改控制器中的代码以期待承诺,就无法直接从我的服务中 return 真或假。将此方法提取到服务中的全部目的是使控制器可以与调用的实现细节分开,我会考虑使用承诺(即未来布尔值)与直接布尔值作为实现细节.

下面是一些代码来说明: 在控制器中:

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() 将 return 未解决的承诺,这显然符合 if 子句的真实值。

我绝对不是 promise 方面的专家,而且我知道这并不是它们的预期使用方式,但我真的不想将控制器绑定到使用 promise。鉴于承诺的 "async" 性质,这甚至可能吗?

更新:我在发帖前确实看过,但什么也没找到,但是 "related questions" 提要中的 ,所以我现在发现我的问题是重复的。那里的答案很有帮助。

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

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

你真的不需要 catch 和 return false 除非你真的需要跟踪 return 值,因为对话框已经 resolves/rejects 基于取消或 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);