Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何基于承诺的结果返回布尔值?_Javascript_Angularjs_Promise_Angular Material - Fatal编程技术网

Javascript 如何基于承诺的结果返回布尔值?

Javascript 如何基于承诺的结果返回布尔值?,javascript,angularjs,promise,angular-material,Javascript,Angularjs,Promise,Angular Material,使用AngularJS应用程序(1.4.3),我希望控制器调用服务上的方法,该方法应返回布尔值 在后台,服务用来调用$window.confirm(),然后只返回结果。我试图将实现切换为使用Angular Material的.confirm()API,但这返回了一个承诺 我遇到的问题是,如果不更改控制器中的代码以期望承诺,就无法直接从我的服务返回true或false。将此方法提取到服务中的全部目的是使控制器可以与调用的实现细节分离,并且我将考虑使用允诺(即,未来布尔)与直布尔作为实现细节。 下面

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

在后台,服务用来调用$window.confirm(),然后只返回结果。我试图将实现切换为使用Angular Material的.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子句的真实值

我绝对不是承诺方面的专家,我知道这并不是期望它们被使用的方式,但我真的不想把控制器束缚在使用承诺上。鉴于承诺的“异步”性质,这可能吗


更新:在我发布之前,我确实看了一下,什么也找不到,但是在“相关问题”提要中,所以我现在看到我的问题是重复的。这里的答案非常有用。

您还必须使您的条件异步,通过承诺链接

i、 e

而且,您实际上不需要catch和
return false
,除非您需要真正跟踪返回值,因为dialog已经基于cancel或Ok解析/拒绝承诺,即不需要下面的块

   .then(function() {
        return true;
    }, function() {
        return false;
    });
所以

只是:

notificationService.confirm('...').then(deleteDevice);

好的,对,分辨率的布尔部分是非常冗余的。那么,如果不使控制器中的代码异步,那么我的猜测是否正确?因为执行已经超出了原始调用函数,并且服务中的.then()“回调”无法到达原始调用函数,对吗?@Sean是的,你是对的,正确的方法是仅通过承诺链接。不,异步不是实现细节,因为它确实改变了调用方的控制流很多。不,没有办法同步地从承诺中得到布尔值。只要让您的控制器期望异步结果,您就可以将其作为一个实现细节,使其同步化。
function confirm(message) {
    var confirm = $mdDialog.confirm()
        .title(message)
        .ariaLabel(message)
        .ok('Yes')
        .cancel('No');

    return $mdDialog.show(confirm);
}
notificationService.confirm('...').then(deleteDevice);