$q 延迟 angular
$q defer in angular
我简化了代码来解决特定问题。
我在 $scope 有两个函数:singleRequest() 和 multiReqest()。
multiReqest() 必须多次调用 testServer() 然后调用 singleRequest().
此示例中的问题:singleRequest() 在 multiReqest() 开始之前调用,但同时 console.log('All requests from multiRequest loaded')依次调用。
为什么会这样?我究竟做错了什么?谢谢
function TestCtrl($scope, $q, $http) {
//variables declaration etc
var testServer = function (_pos) {
console.log('testServer:', _pos)
var deferred = $q.defer();
$http.get(service.first, parameters).success(function (data, status, headers, config) {
console.log(_pos, 'request from multiRequest loaded');
//do smth with data
deferred.resolve();
}).error(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
//
//
$scope.singleRequest = function () {
console.log('Start singleRequest function');
$http.get(service.second).success(function (data, status, headers, config) {
console.log('Single request loaded');
//do smth with data
});
};
//
//
$scope.multiRequest = function (_callback) {
console.log('Start multiRequest function');
var promises = [];
for (var i = 1; i <= 3; i++) {
promises.push(testServer(i));
}
$q.all(promises).then(function () {
console.log('All requests from multiRequest loaded');
_callback;
});
};
//
$scope.multiRequest($scope.singleRequest());
}
控制台日志:
- 启动singleRequest函数
- 启动多请求功能
- 测试服务器:1
- 测试服务器:2
- 测试服务器:3
- 已加载单个请求。 XHR加载完成:GET "http://...
- 1 "request from multiRequest loaded"。 XHR加载完成:GET "http://...
- 2 "request from multiRequest loaded"。 XHR加载完成:GET "http://...
- 3 "request from multiRequest loaded"。 XHR加载完成:GET "http://...
- 已加载来自 multiRequest 的所有请求
你不是在传递回调,而是在此处实际调用函数:
$scope.multiRequest($scope.singleRequest()); // Passing return value
所以你应该把它改成:
$scope.multiRequest($scope.singleRequest); // Passing function
然后把_callback;
改成_callback();
,调用函数。
我简化了代码来解决特定问题。
我在 $scope 有两个函数:singleRequest() 和 multiReqest()。 multiReqest() 必须多次调用 testServer() 然后调用 singleRequest().
此示例中的问题:singleRequest() 在 multiReqest() 开始之前调用,但同时 console.log('All requests from multiRequest loaded')依次调用。 为什么会这样?我究竟做错了什么?谢谢
function TestCtrl($scope, $q, $http) {
//variables declaration etc
var testServer = function (_pos) {
console.log('testServer:', _pos)
var deferred = $q.defer();
$http.get(service.first, parameters).success(function (data, status, headers, config) {
console.log(_pos, 'request from multiRequest loaded');
//do smth with data
deferred.resolve();
}).error(function (err) {
deferred.reject(err);
});
return deferred.promise;
};
//
//
$scope.singleRequest = function () {
console.log('Start singleRequest function');
$http.get(service.second).success(function (data, status, headers, config) {
console.log('Single request loaded');
//do smth with data
});
};
//
//
$scope.multiRequest = function (_callback) {
console.log('Start multiRequest function');
var promises = [];
for (var i = 1; i <= 3; i++) {
promises.push(testServer(i));
}
$q.all(promises).then(function () {
console.log('All requests from multiRequest loaded');
_callback;
});
};
//
$scope.multiRequest($scope.singleRequest());
}
控制台日志:
- 启动singleRequest函数
- 启动多请求功能
- 测试服务器:1
- 测试服务器:2
- 测试服务器:3
- 已加载单个请求。 XHR加载完成:GET "http://...
- 1 "request from multiRequest loaded"。 XHR加载完成:GET "http://...
- 2 "request from multiRequest loaded"。 XHR加载完成:GET "http://...
- 3 "request from multiRequest loaded"。 XHR加载完成:GET "http://...
- 已加载来自 multiRequest 的所有请求
你不是在传递回调,而是在此处实际调用函数:
$scope.multiRequest($scope.singleRequest()); // Passing return value
所以你应该把它改成:
$scope.multiRequest($scope.singleRequest); // Passing function
然后把_callback;
改成_callback();
,调用函数。