使用 promises 递归检索分页数据
Retrieve paginated data recursively using promises
我正在使用 return 以分页形式发送数据的函数。因此它将 return 最多 100 个项目和一个检索下 100 个项目的密钥。我想检索所有可用的项目。
我如何递归地实现这个?递归在这里是一个不错的选择吗?我可以不用递归的任何其他方式吗?
我使用 Bluebird 3x 作为 promises 库。
这是我要实现的目标的片段:
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;
}
});
}
我正在使用 return 以分页形式发送数据的函数。因此它将 return 最多 100 个项目和一个检索下 100 个项目的密钥。我想检索所有可用的项目。
我如何递归地实现这个?递归在这里是一个不错的选择吗?我可以不用递归的任何其他方式吗?
我使用 Bluebird 3x 作为 promises 库。
这是我要实现的目标的片段:
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;
}
});
}