使用承诺以递归方式检索分页数据
Retrieve paginated data recursively using promises
我正在使用一个以分页形式返回数据的函数。因此,它将返回最多 100 个项目和一个用于检索接下来 100 个项目的键。我想检索所有可用的项目。
如何递归实现此目的?递归在这里是一个不错的选择吗?我可以在没有递归的情况下以任何其他方式做到这一点吗?
我正在使用蓝鸟 3x 作为承诺库。
以下是我想要实现的目标的片段:
getEndpoints(null, platformApplication)
.then(function(allEndpoints) {
// process on allEndpoints
});
function getEndpoints(nextToken, platformApplication) {
var params = {
PlatformApplicationArn: platformApplication
};
if (nextToken) {
params.NextToken = nextToken;
}
return sns.listEndpointsByPlatformApplicationAsync(params)
.then(function(data) {
if (data.NextToken) {
// There is more data available that I want to retrieve.
// But the problem here is that getEndpoints return a promise
// and not the array. How do I chain this here so that
// in the end I get an array of all the endpoints concatenated.
var moreEndpoints = getEndpoints(data.NextToken, platformApplication);
moreEndpoints.push.apply(data.Endpoints, moreEndpoints);
}
return data.Endpoints;
});
}
但问题是,如果有更多的数据要检索(见if (data.NextToken) { ... }
),我如何将承诺链接起来,以便最终获得所有端点的列表等。
递归可能是获取所有端点的最简单方法。
function getAllEndpoints(platformApplication) {
return getEndpoints(null, platformApplication);
}
function getEndpoints(nextToken, platformApplication, endpoints = []) {
var params = {
PlatformApplicationArn: platformApplication
};
if (nextToken) {
params.NextToken = nextToken;
}
return sns.listEndpointsByPlatformApplicationAsync(params)
.then(function(data) {
endpoints.push.apply(endpoints, data.Endpoints);
if (data.NextToken) {
return getEndpoints(data.NextToken, platformApplication, endpoints);
} else {
return endpoints;
}
});
}
对于从分页端点递归获取和返回数据的更通用的示例,我想出了以下内容:
getData(page, dataArray) {
return new Promise((resolve, reject) => {
getEndpointHere(
{
page,
pageSize: 50,
},
(err, result) => {
if (err)
return console.error("there was a problem retrieving your data");
dataArray = dataArray.concat(result);
if (result.length < 50) {
resolve(dataArray);
} else {
resolve(getData(page + 1, dataArray));
}
}
);
});
}
getData(1, [])
.then((res) => {
console.log("SEVERAL PAGES OF DATA", res);
})
此示例使用回调 -- (err, result) -- 但是,可以提取该逻辑来处理来自终结点的响应。我消耗的资源不返回光标或"下一个"标记,指示是否有更多记录,因此我使用响应是否少于 50 条记录的逻辑作为继续请求更多数据的基础。
相关文章:
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 如何通过引用var Using DataTables来进行分页或排序
- 使用CSS或JavaScript计算分页符的数量
- DataTables-创建自定义分页样式(加载更多样式)
- 使用ajax的服务器端分页&jQuery
- 分页:如何用AJAX加载第一个页面
- dataTables-如何自定义分页类型以显示最后一个页码后面的省略号,
- 不带jquery的全屏分页
- 更改组合框分页后,getValue和getRawValue返回相同的值
- jQuery简单分页
- 使用jQuery在表中分页
- jQuery分页下一页和上一页按钮在点击零或超过最后一页后失败
- jQuery:根据select选项中的每页项目进行分页
- 如何为我的分页添加格式
- 用键盘分页jQuery下一个和上一个控件.触发器('点击')不'不起作用
- 如何在emberjs中使用幻影假数据进行分页
- 如何使用php对mysql数据库中检索到的数据进行分页
- 使用承诺以递归方式检索分页数据
- 使用 AJAX 从数据库中检索数据,并在没有框架的情况下对它们进行分页
- 从不在当前分页数据表上的文本框中检索值