Javascript 如何通过多次调用dynamodb scan使用承诺
我收到dynamodb.scan()的承诺。如果响应包含LastEvaluatedKey,则在解析承诺时,必须再次调用dynamodb.scan()。当响应不包括LastEvaluatedKey对象时,表的所有记录都已扫描并完成查询。我不知道需要提前调用scan()的次数。我不知道该怎么编码。这就是我现在拥有的:Javascript 如何通过多次调用dynamodb scan使用承诺,javascript,promise,amazon-dynamodb,Javascript,Promise,Amazon Dynamodb,我收到dynamodb.scan()的承诺。如果响应包含LastEvaluatedKey,则在解析承诺时,必须再次调用dynamodb.scan()。当响应不包括LastEvaluatedKey对象时,表的所有记录都已扫描并完成查询。我不知道需要提前调用scan()的次数。我不知道该怎么编码。这就是我现在拥有的: function scan(options, startKey) { var parms = { TableName: options.source, Projec
function scan(options, startKey) {
var parms = {
TableName: options.source,
ProjectionExpression: "book, bid, #kee, #unt, pid, #txt",
FilterExpression: "contains(#txt, :v_qs)",
ExpressionAttributeNames: {
"#unt": "unit",
"#txt": "text",
"#kee": "key"
},
ExpressionAttributeValues: {
":v_qs": options.queryTransformed
}
};
if (startKey) {
parms.ExclusiveStartKey = startKey;
}
return dynamoDb.scan(parms).promise();
}
scan(options).then(function(response) {
if (response.LastEvaluatedKey) {
searchResults.push(response);
return scan(options, response.LastEvaluatedkey);
}
else {
return response
}
}).then(function(response) {
if (response.LastEvaluatedKey) {
searchResults.push(response);
return scan(options, response.LastEvaluatedKey);
}
else {
return response;
}
}).then(function(response) {
//this is crazy - bailing even if another call is needed
searchResults.push(response);
return generateSearchResponse();
});
这显然不是解决问题的办法。此代码是AWS Lambda节点函数的一部分。提前感谢你的帮助 递归函数应该是您的朋友。我自己无法测试,但类似的东西应该能用。如果您遇到任何错误,请告诉我
function scan(options, startKey) {
var parms = {
TableName: options.source,
ProjectionExpression: "book, bid, #kee, #unt, pid, #txt",
FilterExpression: "contains(#txt, :v_qs)",
ExpressionAttributeNames: {
"#unt": "unit",
"#txt": "text",
"#kee": "key"
},
ExpressionAttributeValues: {
":v_qs": options.queryTransformed
}
};
if (startKey) {
parms.ExclusiveStartKey = startKey;
}
return dynamoDb.scan(parms).promise();
}
function processResponse(options, response) {
return (response && response.LastEvaluatedKey) ?
scan(options, response.LastEvaluatedkey)
.then(function(next_response) {
return [response].concat(processResponse(next_response));
})
:
Promise.resolve(response); // replace 'Promise' by whatever Promise library you are using (when, bluebird, ...)
}
scan(options)
.then(processResponse.bind(null, options))
.then(function(response_list) {
// response_list is an array of response
return generateSearchResponse();
});
递归函数应该是您的朋友。我自己无法测试,但类似的东西应该能用。如果您遇到任何错误,请告诉我
function scan(options, startKey) {
var parms = {
TableName: options.source,
ProjectionExpression: "book, bid, #kee, #unt, pid, #txt",
FilterExpression: "contains(#txt, :v_qs)",
ExpressionAttributeNames: {
"#unt": "unit",
"#txt": "text",
"#kee": "key"
},
ExpressionAttributeValues: {
":v_qs": options.queryTransformed
}
};
if (startKey) {
parms.ExclusiveStartKey = startKey;
}
return dynamoDb.scan(parms).promise();
}
function processResponse(options, response) {
return (response && response.LastEvaluatedKey) ?
scan(options, response.LastEvaluatedkey)
.then(function(next_response) {
return [response].concat(processResponse(next_response));
})
:
Promise.resolve(response); // replace 'Promise' by whatever Promise library you are using (when, bluebird, ...)
}
scan(options)
.then(processResponse.bind(null, options))
.then(function(response_list) {
// response_list is an array of response
return generateSearchResponse();
});