$q以棱角分明的方式推迟
$q defer in angular
我简化了代码来解决一个特定的问题。
我在$scope有 2 个函数:singleRequest() 和 multiReqest()。multiReqest() 必须多次调用 testServer(),然后调用 singleRequest()。
这个例子中的问题:singleRequest() 在 multiReqest() 启动之前调用,但同时依次调用 console.log('来自 multiRequest 的所有请求加载')。为什么会这样?我做错了什么?谢谢。
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());
}
控制台日志:
- 启动单个请求函数
- 启动多请求功能
- 测试服务器:1
- 测试服务器:2
- 测试服务器:3
- 加载单个请求。XHR 完成加载:获取"http://...
- 1 个"来自多请求的请求已加载"。XHR 完成加载:获取"http://...
- 2 "来自多请求的请求已加载"。XHR 完成加载:获取"http://...
- 3 "来自多请求的请求已加载"。XHR 完成加载:获取"http://...
- 已加载来自多请求的所有请求
你不是在传递回调,而是在这里实际调用函数:
$scope.multiRequest($scope.singleRequest()); // Passing return value
因此,您应该将其更改为:
$scope.multiRequest($scope.singleRequest); // Passing function
然后将_callback;
更改为 _callback();
,以调用该函数。
相关文章:
- 为什么这在IE中的工作方式与在Firefox中不同
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 使用javascript存储变量的最安全方式
- 以可优化的方式使用requirejs加载模板
- 在Highcharts中,我们可以通过任何方式在渲染图表之前获得plotWidth和plotHeight
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- 为react组件传递道具的最佳方式
- 让Webpack管理Quirky AMD定义的最佳方式
- 在承诺链中处理早期回报的最佳方式
- 如何“;过滤器”;或者以其他方式重构该数据
- 您有更好的动态方式来缩短复杂的代码jquery吗
- 在ng重复循环中显示条件内容的最佳方式是什么
- 在phonegap中为android调用onload函数的最佳方式
- 如何创建更好的方式来维护基于我的代码访问的最后一个页面
- Javascript以不同的方式声明数字
- 链接两个网页或网络应用程序的最佳方式
- 什么's是连接供应商js文件的最佳方式
- $q以棱角分明的方式推迟