Я пытаюсь реализовать $ q.all для запуска некоторых функций, а затем возвращать все выходы в функцию, прикрепленную к. Then в конце.
В настоящее время обещания выглядят так, как будто они звонят в правильном порядке, а $ all. Then происходит в конце, но переменная результатов возвращается с массивом нулей (по одному для каждого обещания в $ q.all)
JS Фидл можно найти на http://jsfiddle.net/QqKuk/120/ и я использую угловой 1.0.1
ниже приведен упрощенный пример кода я.
Вот мой html, просто там, чтобы отобразить отладочный текст и вывод.
<div ng-controller="MyCtrl">
<p>{{fromThen}}</p>
<p>{{fromThen2}}</p>
<p>{{runOrder}}</p>
</div>
и вот мой контроллер, в действительности Logone, logTwo и logThree не будет одинаковых функций.
var myApp = angular.module ('myApp', []);
функция MyCtrl ($ Объем, $ д, $ таймаут) {
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 [NULL, NULL, NULL] .logOne(). logTwo(). logThree(). then
Которая для меня выглядит так, как будто вещи звонят в правильном порядке, поэтому я смущен, почему я получаю нули в возвращаемом значении. Я использую defer.resolve (значение) неправильно?
Я рассмотрел некоторые другие примеры здесь, но я не смог понять, почему я не получаю результата.
Спасибо за любую помощь, которую вы можете дать. Поскольку это также мой первый пост, все советы о том, какую информацию я должен включать (или не нужно включать), также будут оценены.
Спасибо. Neil
Это было именно то, что мне нужно, спасибо за подсказку об использовании добавьте defer в doSomethingDeferredWith(), поскольку это было что-то еще, к чему я буду двигаться дальше. –
Да, часто вы будете использовать шаблон отложенного/обещания с услугами, которые откладываются, например '$ http'. Фактически «$ http» создает новый отложенный объект и разрешает его в обработчике 'onreadystatechange' для базового' XmlHttpRequest'. Также важно помнить, что '.то «возвращает само обещание, которое разрешается, когда функция, переданная в качестве параметра, возвращается, что позволяет вам связывать обещания даже с вызовом' $ q.all'. – citizenslave