$http请求在一个请求中返回所有记录而不分页
$http request to return all records without pagination in a single request
有4000多条记录。API最多返回1000条记录并具有分页。我调用这个函数(循环),并使用"skip"以1000条记录为间隔获取记录。
我一次需要所有记录,但下面的代码只返回前1000条记录。
var array=[];
function loop(skip){
return $http({
method: 'GET',
url: myurl+'&$skip='+skip,
timeout:5000
}).success(function(res){
if(res.d.length>0)
{
Array.prototype.push.apply( array,res.d);
loop(skip +1000);
}
return array;
}).error(function(response,status,headers,config) {
});
}
getAll = function() {
return loop(0);
}
我需要一个单一的请求才能获得总记录。但只有我得到了这部分的前1000条记录:(
getAll().then(function() {
console.log("in this part i need the array with my 4000 records")
});
首先,角度文档的一个小注释:
$http
遗留承诺方法success
和error
已被弃用。请改用标准然后的方法。如果$httpProvider.useLegacyPromiseExtensions
设置为false,那么这些方法将抛出$http/legacy
错误。
另一种解决方案:将累加器结果作为参数传递给循环函数
function loop(skip,result){
result = result||[];//accumulator for result, init empty array if not pass
return $http(
{
method: 'GET',
url: myurl+'&$skip='+skip,
timeout:5000
}).then(function success(response){
if(response.data.length > 0){
Array.prototype.push.apply(result,response.data);
return loop(skip+1000,result);
}
return result;
},function error(){
});
}
请注意,与当前代码的主要区别是在成功处理程序中调用loop
函数之前的return
。
这项工作,因为如果从then
函数返回promise,那么在返回promise后将应用下一个then
。
样本plunkr
应该可以使用一些递归承诺链接。试试这个
function getAll(page) {
if (typeof page === 'undefined') {
page = 0;
}
return $http.get(myurl, {$skip: page * 1000}).then(function(res) {
var data = res.data;
if (data.length > 0) {
return getAll(page + 1).then(function(nextData) {
return data.concat(nextData);
});
}
return data;
});
}
并称之为
getAll().then(function(allRecords) {
console.log(allRecords);
});
这是一个被黑在一起的Plunker演示~http://plnkr.co/edit/ey8gdytvuBE6cpuMAtnB?p=preview
工作样品https://jsfiddle.net/coolbhes/xmqur1bq/(用承诺取代服务)
适用于您的代码如下:
var array = [];
function loop(skip, resolveHandle) {
$http({
method: 'GET',
url: myurl + '&$skip=' + skip,
timeout: 5000
}).then(function successCallback(res) {
if (res.d.length > 0) {
Array.prototype.push.apply(array, res.d);
loop(skip + 1000, resolveHandle);
} else {
//done with all requests;
resolveHandle(array);
}
}, function errorCallback(rej) {
});
};
function getAll() {
return new Promise(function(resolve, reject) {
loop(0, resolve);
});
}
getAll().then(function(data) {
console.log("in this part i need the array with my 4000 records", data)
}
相关文章:
- 在使用量角器进行e2e测试时记录xhr请求
- $http请求在一个请求中返回所有记录而不分页
- 在 $.ajaxSetup 转换器中获取 ajax 请求 URL,以便进行日志记录
- 如何将所有 HTTP 请求记录到我的 Sails.js 服务器
- 代码日志记录在$.get请求中运行时未定义,但在页面上运行时工作正常
- 使用Good在Hapi.js中记录请求和响应有效载荷
- 是否可以用javascript记录HTTP请求客户端
- 日志记录请求是单独的好习惯还是杂乱的
- 使用Node.js在http请求成功后记录图像
- 使用iMACROS在运行Javascript后监控/记录HTTP请求(图像请求)
- ajaxStop:如何记录请求的url
- 修改对象的原型,以便在每次请求变量时向控制台记录日志
- 如何记录一个层's特性上请求的坐标
- 记录请求的往返加载时间
- 猫鼬查找具有多个条件的记录并检查请求参数是否为空
- 发送跨域请求以记录数据
- 当请求的ID不存在时如何避免空记录?(余烬)
- jQuery.ajax() 记录 HTTP 请求
- 来自请求对象的节点/快递访问记录器
- 在Node.js中记录请求和响应到控制台