我是angularjs的新手。我的目标非常简单。我想进行ajax调用以获取数据,并且一旦完成,我想再次调用以获取依赖于第一组信息的另一组数据。
我试图利用承诺机制来做这件事,这样我就可以利用链接代替嵌套的ajax调用,并且更好地保留具有我可以根据需要联系在一起的独立函数的能力。
我的代码类似于以下内容:
var promiseGetWorkTypes = function ($q, $scope, $http) {
console.log("promiseGetWorkTypes");
return $q(function (resolve, reject) {
$http({
method: 'GET',
url: '/WorkTypes'
}).then(
function (payload) {
console.log("Got workttypegroups")
console.log(payload);
$scope.WorkTypeGroups = payload.data;
console.log("End of worktypegroups");
resolve(payload);
},
function (payload) {
reject(payload);
});
});
};
var promiseGetRecentActivities = function ($q, $scope, $http) {
console.log("promiseGetRecentActivities");
return $q(function (resolve, reject) {
$http({
method: 'GET',
url: '/RecentHistory'
}).then(
function (payload) {
$scope.RecentActivities = payload.data;
resolve(payload);
},
// data contains the response
// status is the HTTP status
// headers is the header getter function
// config is the object that was used to create the HTTP request
function (payload) {
reject(payload);
});
});
};
var index = angular.module("index", []);
index
.controller('EntitiesController', function ($scope, $http, $timeout, $q) {
promiseGetWorkTypes($q, $http, $scope)
.then(promiseGetRecentActivities($q, $http, $scope));
}

然而,当我查看我的调试控制台时,我看到对" promiseGetRecentActivities"的调用。在调用Ajax处理之前就开始了#34; promiseGetWorkTypes"。
我在这里错过了什么或做错了什么?
答案 0 :(得分:7)
写作时
promiseGetWorkTypes($q, $http, $scope).then(promiseGetRecentActivities($q, $http, $scope));
在评估此行时调用promiseGetActivites
。您应该能够将调用包装到另一个函数中的promiseGetActivities
以延迟调用,直到第一个promise已经解决以使调用按顺序运行:
promiseGetWorkTypes($q, $http, $scope).then(function() {
promiseGetRecentActivities($q, $http, $scope);
});
原因与then
内发生的事情无关,而是由于Javascript语法。以下内容:
myFunc1(myFunc2());
将调用myFunc2()
的结果传递给myFunc1,不引用myFunc2
函数。从逻辑上讲,myFunc2
必须在myFunc1
之前运行。如果你写了
myFunc1(myFunc2);
然后myFunc1
会收到对myFunc2
的引用,因此myFunc1
会在myFunc2
之前运行(事实上,myFunc2
只会在某处运行在myFunc1
内,有代码可以调用它。)
内联/匿名定义函数不会更改此行为。要将匿名函数的结果传递给另一个函数,您可以执行以下操作
myFunc1((function() {
return 'something';
})());
将首先评估匿名函数,因为其返回值'something'
将传递给myFunc1
。要传递对匿名函数的引用,您可以执行以下操作:
myFunc1(function() {
return 'something';
});
然后它将最多myFunc1
是否会调用传递给它的函数。
将它带回您的问题,您的代码:
promiseGetWorkTypes($q, $http, $scope).then(promiseGetRecentActivities($q, $http, $scope));
将promiseGetRecentActivities($q, $http, $scope)
的结果传递给then
,因此必须在then
运行之前运行,因此肯定不会等待promiseGetWorkTypes
的承诺得到解决。你似乎想要的是传递一个函数,当被调用时,运行promiseGetRecentActivities($q, $http, $scope)
,这是什么
promiseGetWorkTypes($q, $http, $scope).then(function() {
promiseGetRecentActivities($q, $http, $scope);
});
确实
作为旁注,将$q
,$http
等传递给各种函数似乎有点不寻常/过于复杂,但我认为可能超出了这个问题的范围来通过替代方案