读取数据库功能-执行顺序

时间:2018-11-14 10:57:08

标签: javascript node.js

我正在读取数据库,并以字符串形式输出结果。 问题是有时输出为空,我的猜测是在数据库读取完成之前执行了函数“ 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);
}

1 个答案:

答案 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"