首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用推送将JS对象插入到数组中在某些上下文中不起作用

使用推送将JS对象插入到数组中在某些上下文中不起作用
EN

Stack Overflow用户
提问于 2019-03-12 03:45:22
回答 2查看 59关注 0票数 0

在下面的代码中,‘db.each’中使用的users.push不起作用。但是,如果我将‘users.push’移到外部,那么它似乎可以工作。

如何将新对象从db.each推送到用户数组中?

代码语言:javascript
复制
let db = new sqlite3.Database('./db/main.db', (err) => {
  if (err) console.error(err.message);
  console.log('Connected to the main database.');
});

var users = [];

db.serialize(() => {
  db.each(`SELECT email, name FROM users`, (err, row) => {
    if (err) console.error(err.message);
    let user = {
      email: row.email,
      name: row.name
    }
    users.push(user);
  });
});

console.log(JSON.stringify(users));
db.close();

我使用的是express和sqlite3节点包。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-12 03:50:48

这是因为db.serializedb.each是异步函数(并且立即返回,因此在执行console.log回调之前执行db )。

下面是一个有效的示例:

代码语言:javascript
复制
db.serialize(() => {
      db.each(`SELECT email,
                      name
               FROM users`, (err, row) => {
        if (err) {
          console.error(err.message);
        }

        let user = {
            email : row.email,
            name : row.name
        }

        users.push(user);

        console.log(JSON.stringify(users));

        db.close(); 

      });
    });
票数 2
EN

Stack Overflow用户

发布于 2019-03-12 04:01:35

第一个错误:未正确处理异步性

正如Antoine Chalifour所指出的,在异步回调中修改users之前调用console.log(JSON.stringify(users));。有关修复和解释,请参阅他的回答。

第二个错误:错误未处理

您编写了if (err) { console.error(err.message); },然后继续执行函数的其余部分。这很糟糕,因为可能会发生错误,您只需继续执行程序即可。相反,您应该编写类似这样的代码:

代码语言:javascript
复制
if (err) {
  console.error(err);
  return;
}

或者:

代码语言:javascript
复制
if (err) throw err;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55109253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档