angularjs promises 在显示消息之前等待 3 个服务完成

angularjs promises waiting for 3 services to complete before showing message

我在 UI 上有一个包含 3 个选项的复选框,每个复选框选项都代表一个要完成的独立服务。但是,由于这些服务被可变地调用,我需要想出一种方法来等待所有选定的选项完成,直到显示消息。

基本上,最初的实现是这样的:

if (doA) {
   mysvc.doA();
}

if (doB) {
   mysvc.doB();
}

if (doC) {
   mysvc.doC();
}

window.alert('success');

然后我意识到我需要等待它们全部完成,所以我想到了这个:

if (doA) {
   mysvc.doA();
}

if (doB) {
   mysvc.doB();
}

if (doC) {
   mysvc.doC();
}

setTimeout(function () {
    window.alert('success');
}, 8000);

因为如果全部选中,操作通常最多需要 8 秒才能完成。但这显然并不理想。另外,我最终想在最后为每个单独的操作提供反馈。任何帮助或资源将不胜感激。

您能否为每个调用附加一个变量,然后仅在它们都为真时才显示成功?

var doaCheck = false;
var dobCheck = false;
var docCheck = false;

if (doA) {
   mysvc.doA();
   doaCheck = true;
}

if (doB) {
   mysvc.doB();
   dobCheck = true;
}

if (doC) {
   mysvc.doC();
   docCheck = true;
}

if (doaCheck && dobCheck && docCheck ) {
   window.alert('success');
   // code to reset
}

您可以使用 $q.all:

var promises = [];
if (doA) {
   promises.push(mysvc.doA);

}

if (doB) {
   promises.push(mysvc.doB);
}

if (doC) {
   promises.push(mysvc.doC);
}

$q.all(promises).then(function(d){
    window.alert('success');
})

最正确的方法是使用 angular 的 $q. Each function should return a promise, then you can take all 3 promises and use $q.all to combine them together and have a callback function that runs only once all 3 are done. Here's an example with $http promises, but you can do it for anything by creating your own promises using $q.defer() as done here: example using $q.defer()

的承诺
    q1 = $scope.q1 = $q.defer(),
    q2 = $scope.q2 = $q.defer(),
    p1 = $scope.q1.promise, 
    p2 = $scope.q2.promise;


    $scope.fromThen = $q.all([
                            p1.then(thenFn), 
                            p2.then(thenFn)
                        ])
                        .then(function(values) {        
                            console.log(values);
                            return values;
                        });