我有这项服务
angular.module("myApp").service("xhrService", [
"$q", function($q) {
var promises = [];
return {
push: function(promise) {
promises.push(promise);
},
process: function($scope) {
$q.all(promises).then(function() {
$scope.$emit("loading:dataReady");
promises = [];
});
}
}
}]);
父控制器中的此代码
$scope.$on("loading:dataReady", function () {
console.log("Data Ready");
});
子控制器中的此代码
var getEstimatedExpenseTypes = $http.get("api/estimatedExpenseType").then(
function (response) {
console.log("getEstimatedExpenseTypes Success");
$scope.estimatedExpenseTypes = response.data;
},
function(response) {
console.log(response.data);
}
);
xhrService.push([getEstimatedExpenseTypes]);
xhrService.process($scope);
我遇到的问题是console.log没有按照我期望的顺序发生。在chrome中,使用此代码,我首先看到“Data Ready”,然后“getEstimatedExpenseTypes Success”。不应该是相反的方式吗?
我认为$ q.all()。then(...)
代码会在all()
中的承诺之后运行。但是根据控制台写入的顺序来判断,情况似乎并非如此
这里发生了什么。我不能正确理解这是如何工作的
更新: 已修复$on
代码放置
答案 0 :(得分:1)
$q.all
期待一系列承诺,提到的代码使其成为承诺的array of array
xhrService.push([getEstimatedExpenseTypes]);
将数组[getEstimatedExpenseTypes]
推入数组var promises = [];
用xhrService.push([getEstimatedExpenseTypes]);
替换xhrService.push(getEstimatedExpenseTypes);
会使执行顺序正确。
修改强>
如果你想从控制器推送一系列承诺,你可以改变服务中的推送方法,
push: function(promise) {
Array.prototype.push.apply(promises, promise);
}
然后你可以写一些类似
的东西xhrService.push([getEstimatedExpenseTypes]);
修改强>
如果你想为你的服务添加单一和承诺数组,那么这样的事情应该可行
push: function(promise) {
if(Object.prototype.toString.call(promise) == "[object Object]")
promises.push(promise);
else if if(Object.prototype.toString.call(promise) == "[object Array]")
Array.prototype.push.apply(promises, promise);
}
希望这会有所帮助。