2017-05-30 69 views
0

这里,这是我的方案。 Click to see the Image同步和同时执行角函数

请参考上面的图片。 A,B,C,D是dropBoxes。并且每个框的数据都通过http请求加载到页面加载上。并且,在成功完成每个请求并将数据加载到dropBoxes(每个拖放框具有单独的功能)后,应启用该按钮。假设每个请求都会从数据库中获取不同大小的dataBulk。所以,我想知道的是, - 我如何跟踪每个dropBox是否已成功加载或不启用按钮?

由于我是Angular的小说,对此非常期待和欣赏你的回答和专业实践。

注:函数可以独立使用,是必须的!我正在使用angularJs 1.x

+0

如果您正在使用AJAX和$ HTTP。每个盒子的每个$ http请求将返回一个Promise。成功回调会让你知道它是否成功加载,错误回调会让你知道它是否没有成功。 – Hoyen

+0

[我如何从异步调用返回响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Igor

回答

1

$q运营商有公用事业处理承诺。其中之一是all()函数,它在调用函数之前等待数组中的所有promise。像这样:

var promiseA = $http.get('url1').then(function(response) { 
    $scope.dataA = response.data 
}); 
var promiseB = $http.get('url2').then(function(response) { 
    $scope.dataB = response.data 
}); 
var promiseC = $http.get('url3').then(function(response) { 
    $scope.dataC = response.data 
}); 
var promiseD = $http.get('url4').then(function(response) { 
    $scope.dataD = response.data 
}); 

$q.all([promiseA, promiseB, promiseC, promiseD]).then(function() { 
    enableButton(); 
}) 
+0

谢谢!真正清楚简单的解释! (Y) –

2

您需要使用$q.all()并传入您的承诺数组。每个人仍然会独立解决,一旦他们全部解决了,您的$q.all()上的.then()将解决。在这里我嘲笑了一个工作示例,它在等待1,2或5秒后才返回字符串数据。

angular.module('app', []) 
 
    .service('dataService', function($q, $timeout) { 
 
    var service = {}; 
 
    service.getData1 = function() { 
 
     var deferred = $q.defer(); 
 
     $timeout(function() { 
 
     deferred.resolve("getData1 resolved"); 
 
     }, 1000); 
 
     return deferred.promise; 
 
    }; 
 
    service.getData2 = function() { 
 
     var deferred = $q.defer(); 
 
     $timeout(function() { 
 
     deferred.resolve("getData2 resolved"); 
 
     }, 2000); 
 
     return deferred.promise; 
 
    }; 
 
    service.getData3 = function() { 
 
     var deferred = $q.defer(); 
 
     $timeout(function() { 
 
     deferred.resolve("getData3 resolved"); 
 
     }, 5000); 
 
     return deferred.promise; 
 
    }; 
 
    return service; 
 
    }) 
 
    .controller('ctrl', function(dataService, $q) { 
 
    var svcCall1 = dataService.getData1().then(function(data) { 
 
     console.log(data); 
 
    }); 
 
    var svcCall2 = dataService.getData2().then(function(data) { 
 
     console.log(data); 
 
    }); 
 
    var svcCall3 = dataService.getData3().then(function(data) { 
 
     console.log(data); 
 
    }); 
 

 
    $q.all([svcCall1, svcCall2, svcCall3]).then(function() { 
 
     console.log("all getData calls completed"); 
 
    }); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="ctrl as vm"> 
 
</div>

+0

谢谢@Lex!将检查! (Y) –

+0

能否请你解释我如何使用角1.3少许诺,为结构 $ scope.functionOne =函数(值) {$ HTTP({ // POST请求 } ).success(函数(响应) {//////////////}).error(函数(响应) {///////////}) } –

+0

我没有使用Angular 1.3,但承诺不是一个Angular事物,所以我怀疑它的用法是一样的。我建议的一件事是使用服务,而不是直接从控制器调用'$ http'。将这些放置在服务中允许方法在许多控制器之间共享,并且还简化了处理承诺解决方案。我也会避免'.success()'并选择'.then()',因为前者已被弃用。 – Lex