gpt4 book ai didi

javascript - Lambda 通过 While 循环多次调用 DynamoDB DocumentClient

转载 作者:行者123 更新时间:2023-11-30 20:00:17 25 4
gpt4 key购买 nike

祝大家感恩节快乐!我正在编写一个调用 DynamoDB 的 lambda 函数,但我遇到了设计/实现问题。

我有以下代码结构:

exports.handler = function(event, context, callback) {
documentClient.batchGet(getParams, function(err, data) {
if (err) {
console.log(err);
} else {
...
while (1) {
documentClient.scan(scanParams, function(err, data)
{
if (err) {
console.log(err);
} else {
...
if (some condition) {
break;
}
}
}
}
}

我无法从 documentClient 的回调内部调用 break。此外,我无法将变量从 documentClient 的回调内部传递到外部,然后跳出 while 循环。我尝试在处理程序范围内创建一个变量并在 documentClient 回调函数中为其分配一个值,但是一旦代码超出回调范围,该值将被删除并且该变量在处理程序范围内具有其原始值。

之所以会出现while循环,是因为如果表很大,扫描会进行多次尝试。

此外,另一个问题是我想在与处理程序相同的范围内执行回调,而不是像扫描 documentClient 的回调函数那样在嵌套 block 内。但是,我似乎无法将任何数据或变量从嵌套 block 内部传递到外部。

我进行了搜索,但找不到有关此问题的任何文档。提前感谢您的阅读。

最佳答案

假设您只能使用 Node.js 6.x(并且不允许使用较新的版本),答案如下:

// Node.js 6.x answer:

exports.handler = function (event, context, callback) {
documentClient.batchGet(getParams, function (err, data) {
if (err) {
console.log(err);
} else {
// ...
runScan(scanParams, function(err, scanOutput) {
if (err) return callback(err);
// do something with scanOutput.
});
}
});
};


function runScan(scanParams, callback) {
documentClient.scan(scanParams, function (err, data) {
if (err) return callback(err);
if (some_condition) {
var scanOutput = ...;
return callback(null, scanOutput);
}

// Halting condition
if(!data.LastEvaluatedKey) {
return callback(new Error('End of scan'));
}

scanParam.ExclusiveStartKey = data.LastEvaluatedKey;
runScan(scanParams, callback);
});
}

要点:

  • 我将扫描功能移到了它自己的函数中 (runScan())。

  • 我们使用递归代替 while 循环:runScan() 调用自身 - 但使用不同的 ExclusiveStartKey - 扫描下一批项目.

  • runScan() 它是一个异步方法:它不返回传统意义上的值。相反,它需要一个回调函数。如果检测到错误,它会调用 callback(err)(相当于抛出异常)。如果它想向其调用者“返回一个值”,它会调用 callback(null, value);调用者必须传递一个回调函数(带有两个参数)并分别检查它们。

  • 当没有LastEvaluatedKey 时扫描结束。在这里,它通过将错误对象(异常)作为回调的第一个参数传递给调用者。

  • 最后,如果您被允许使用 Node.js 8.x(或更高版本),您可以使用 async/await 这大大简化了异步代码的编写.

关于javascript - Lambda 通过 While 循环多次调用 DynamoDB DocumentClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53453758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com