【问题标题】:Javascript callback function doesn't modify arrayJavascript回调函数不修改数组
【发布时间】:2021-04-22 17:35:48
【问题描述】:

我正在尝试创建一个to-do list page,并从mongodb database 读取项目,当我console.log(item) callback function 内部时,它会打印每个项目。

但是当我console.log(items) 查找功能之外,它显示为空,结果,我无法显示任何项目。为什么 items 数组是空的?

app.get("/", (req, res) => {
    var items = [];
    Item.find({}, function(err, results) {
        results.forEach(function(item) {
            console.log(item);
            items.push(item);
        });
    });
    console.log(items);
    res.render("list", { listTitle: "Today", newListItem: items });
});

【问题讨论】:

  • Item 是什么?您确定 Item.find() 不是异步的,并且空的外部控制台输出位于所有日志的末尾吗?

标签: javascript arrays mongodb express scope


【解决方案1】:

问题

发生这种情况是因为Item.find() 是异步的,并且在您的console.log(items)res.render() 运行之前不会向items 推送任何内容

解决方案

  • 将您的res.render() 移动到Item.find() 回调函数中
  • 使用Async/Await

有回调

app.get("/", (req, res) => {
    var items = [];
    Item.find({}, function(err, results) {
        results.forEach(function(item) {
            console.log(item);
            items.push(item);
        });
        console.log(items);
       res.render("list", { listTitle: "Today", newListItem: items });
    });
    
});

使用异步/等待

app.get("/", async (req, res) => {
    var items = [];
    const results = await Item.find()
    results.forEach(function(item) {
       console.log(item);
       items.push(item);
    });
    console.log(items);
    res.render("list", { listTitle: "Today", newListItem: items });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多