【发布时间】:2014-02-14 11:11:53
【问题描述】:
我正在尝试实现 $q.all 来运行一些函数,然后将所有输出返回到最后附加到 .then 的函数中。
目前,promise 看起来它们以正确的顺序调用,并且 $all .then 发生在最后,但是 results 变量返回一个空数组(一个对应于 $q 中的每个 promise .all)
JS Fiddle 可以在 http://jsfiddle.net/QqKuk/120/ 找到,我使用的是 angular 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', []);
function MyCtrl($scope, $q, $timeout) {
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
在我看来,事情是以正确的顺序调用的,所以我很困惑为什么我在返回值中得到空值。我是否错误地使用了 defer.resolve(value)?
我查看了此处的其他一些示例,但我无法弄清楚为什么我没有得到结果。
感谢您提供的任何帮助。由于这也是我的第一篇文章,任何关于我还应该包含(或不需要包含)哪些信息的提示也将不胜感激。
谢谢。 尼尔
【问题讨论】:
标签: javascript angularjs q