在回调函数中检索数据

Retrieve data in callback function

提问人:duyvan 提问时间:7/10/2023 最后编辑:duyvan 更新时间:7/10/2023 访问量:59

问:

我是JS的新手,将duckdb与NodeJS一起使用,我在回调函数中收到响应,并能够控制台.log出数据

结果

db.all('SELECT sku, sum(sales) as sales from B group by all', function(err, responses) {
    const newData = []
    if (err) {
      throw err;
    }
    else{
    for(let row of responses) {
        newData.push(row)
        console.log(row)
      }
}

});
{ sku: 'C', sales: 30 }
{ sku: 'A', sales: 35 }
{ sku: 'B', sales: 20 }

我尝试的下一行代码

console.log(newData) 

但它失败了

ReferenceError: newData is not defined
node.js 回调 duckdb

评论


答:

-1赞 Hegel Motokoua 7/10/2023 #1

您遇到的问题是由于 newData 变量的作用域。目前,newData 变量是在回调函数中声明的,这意味着它只能在此代码块访问。

若要解决此问题,可以在回调函数外部声明 newData 变量,以便在整个代码主体中都可以访问该变量。这是你如何做到的:

// Declare newData outside the callback function
const newData = [];

db.all('SELECT sku, sum(sales) as sales from B group by all', function(err, responses) {
  if (err) {
    throw err;
  } else {
    for (let row of responses) {
      newData.push(row); // Append the data to newData
      console.log(row);
    }
  }
});

console.log(newData); // Now newData can be accessed here

通过此更改,newData 变量将可以在回调函数外部访问,您可以使用它在查询后显示数据或执行其他操作。

评论

0赞 NotTheDr01ds 7/10/2023
欢迎回到 Stack Overflow。看起来你已经有一段时间没有发帖了,可能不知道当前的政策,因为你今天的两个答案似乎可能完全或部分是由人工智能(例如,ChatGPT)编写的。请注意,此处禁止发布 AI 生成的内容。如果您使用 AI 工具来帮助回答任何答案,我鼓励您删除它。谢谢!
0赞 NotTheDr01ds 7/10/2023
读者应该仔细和批判性地审查这个答案,因为人工智能生成的信息通常包含根本性的错误和错误信息。如果您发现质量问题和/或有理由相信此答案是由 AI 生成的,请留下相应的反馈。审核团队可以使用您的帮助来识别质量问题。
0赞 duyvan 7/10/2023 #2

我重构了代码,它仍然无法按预期工作

// Declare newData outside the callback function
const newData = [];

db.all('SELECT sku, sum(sales) as sales from B group by all', function(err, responses) {
  if (err) {
    throw err;
  } else {
    for (let row of responses) {
      newData.push(row); // Append the data to newData
      console.log(row);
    }
  }
});

console.log("newData", newData); // Now newData can be accessed here

它显示

newData []
{ sku: 'C', sales: 30 }
{ sku: 'A', sales: 35 }
{ sku: 'B', sales: 20 }

我相信它会在 newData 将新对象推送到它之前控制台.log newData。