$ q.all을 구현하여 일부 기능을 실행하고 모든 출력을 .then 끝에 첨부 된 함수로 반환하려고합니다.
약속이 올바른 순서로 호출되고 $ all. 결국 끝나고있는 것처럼 보이지만 결과 변수는 널 (null)의 배열로 돌아옵니다 (각 약속에 대해 $ q.all)
JS 바이올린 http://jsfiddle.net/QqKuk/120/에서 발견 될 수 있으며, I는 아래의 난이 코드의 간략화 된 예이다 각도 1.0.1
를 사용하고 있습니다.
여기 내 HTML입니다. 단지 디버그 텍스트와 출력을 표시하기위한 것입니다. 여기
<div ng-controller="MyCtrl">
<p>{{fromThen}}</p>
<p>{{fromThen2}}</p>
<p>{{runOrder}}</p>
</div>
및
현실 로곤, logTwo에, 내 컨트롤러, 그리고 logThree 동일한 기능 될 수 없습니다.var myApp = angular.module ('myApp', []);
함수 MyCtrl ($ 범위, $ q를 $ 시간 초과) {
var logOne = function (value) {
$scope.fromThen = $scope.fromThen + value;
var deffered = $q.defer();
deffered.promise.then(function() {
$scope.runOrder = $scope.runOrder + '.logOne()';
$scope.fromThen = $scope.fromThen + value.toUpperCase();
deffered.resolve(value);
return deffered.promise;
});
deffered.resolve();
};
var logTwo = function (value) {
$scope.fromThen = $scope.fromThen + value;
var deffered = $q.defer();
deffered.promise.then(function() {
$scope.runOrder = $scope.runOrder + '.logTwo()';
$scope.fromThen = $scope.fromThen + value.toUpperCase();
deffered.resolve(value);
return deffered.promise;
});
deffered.resolve();
};
var logThree = function (value) {
$scope.fromThen = $scope.fromThen + value;
var deffered = $q.defer();
deffered.promise.then(function() {
$scope.runOrder = $scope.runOrder + '.logThree()';
$scope.fromThen = $scope.fromThen + value.toUpperCase();
deffered.resolve(value);
return deffered.promise;
});
deffered.resolve();
};
$scope.fromThen = '';
$scope.fromThen2 = 'No Value';
$scope.runOrder = '';
$q.all([logOne('One'), logTwo('Two'), logThree('Three')])
.then(function(results) {
$scope.runOrder = $scope.runOrder + '.then';
$scope.fromThen2 = results;
});
}
내가 갖는 출력은
OneTwoThreeONETWOTHREE 이다, 널, 널 널] .logOne(). logTwo(). logThree(). then
어떤 것들이 올바른 순서로 호출되는 것처럼 보이므로 반환 값에서 null을 얻는 이유가 무엇인지 혼란 스럽습니다. defer.resolve (value)를 잘못 사용하고 있습니까?
여기에 다른 예제를 살펴 봤지만 결과가 나오지 않는 이유를 해결하지 못했습니다.
도움을 주셔서 감사합니다. 이것도 내 첫 번째 게시물이기 때문에, 내가 포함해야하는 정보 (또는 포함 할 필요가없는 정보)에 대한 조언도 감사 할 것입니다.
감사합니다. Neil
에 doSomethingDeferredWith()에서 추가 연기가 발생했습니다. –
네, 종종'$ http'처럼 지연된/약속하는 패턴을 사용합니다. '$ http'가 근본적으로하고있는 것은 새로운 지연 객체를 생성하고 그것을 기본'XmlHttpRequest'를위한'onreadystatechange' 핸들러에서 해결하는 것입니다. '그 기억하는 것도 중요합니다.then'은 매개 변수로서 전달 된 함수가 반환 될 때 해결되는 약속 그 자체를 리턴합니다. 그래서'$ q.all' 호출로도 약속을 연결시킬 수 있습니다. – citizenslave