我正在读取数据库,并以字符串形式输出结果。 问题是有时输出为空,我的猜测是在数据库读取完成之前执行了函数“ json”。我尝试应用在其他线程中读取的“回调”,但并没有解决。 我在做什么错了?
var response = {};
var items = {};
var table = "table";
exports.handler = async (event) => {
ReadDB(json);
return response;
};
//**********************ReadDB Function
function ReadDB(callback) {
var paramsRead = {
TableName: table,
};
// Call DB to read the item from the table
ddb.scan(paramsRead, function(err, data) {
if (err) {
console.log("Error reading DynamoDB", err);
} else {
items = data.Items;
}
});
callback(items);
}
//**********************json Function
function json(items) {
console.log(items);
response = {
body: JSON.stringify({items}, null, '\t'),
};
console.log(response);
}
答案 0 :(得分:0)
是的,这称为异步。这是相关的位:
// Call DB to read the item from the table
ddb.scan(paramsRead, function(err, data) {
if (err) {
console.log("Error reading DynamoDB", err);
} else {
items = data.Items;
}
});
callback(items);
您可能希望ddb.scan()
触发并完成,然后 callback()
。但是扫描功能是异步的,(简而言之)它不会阻止其余代码。
您应该将这段代码读为:ddb.scan()
开始 ,然后callback()
开始 。 .scan()
实际上总是比较慢,因此没有结果。
在您的示例中,您将数据保存在其他地方,这就是您触发callback(data.Item)
的地方,因为该代码位于.scan()
函数的 revolve 上。 / p>
承诺是一个棘手的概念,一开始会引起您的注意,我建议您进行一些研究。一开始很难控制诺言,但了解基本知识是可行的。
Suggested reading material I found by Googling "javascript simple promises explanation"