javascript - javascript 中的对象数组未按预期返回

标签 javascript jquery arrays sqlite

我有一个返回 Javascript 对象列表的函数,我从另一个函数调用这个函数并尝试使用它的一些值,但每当我尝试访问所述值时,它们返回未定义。

这是我生成列表的函数 - 这个想法是它创建一个 sqlite3 数据库(如果它不存在),并返回一个包含每个事件的数组。

function listAllEvents() {
    const sqlite3 = require('sqlite3').verbose();
    const db = new sqlite3.Database('schedule.db');

    const selectionArray = [];

    db.serialize(() => {
        db.run(`
        CREATE TABLE IF NOT EXISTS todo (
            name text,
            date text,
            id text primary key
            )
        `);

        db.all('SELECT * FROM todo ORDER BY date', [], (err, rows) => {
            if (err) {
                throw err;
            }

            rows.forEach((row) => {
                selectionArray.push(row);
            });
        });
    });
    return selectionArray;
}

我从另一个函数调用这个函数,但是当我尝试访问数组中的值时,它们似乎不起作用,我不太明白。

function displayUpcomingEvents() {
    const events = listAllEvents();

    // console.log(events); <-- This line here! In the console, it correctly states the length of the array
    // console.log(events.length) <-- This line, however, returns 0. Why?
    // console.log(events[0]) <-- This doesn't work either, it just returns "undefined".

    for (let i = 0; i < events.length; i += 1) {
        $('#upcomingEvents').after('<li>asdf</li>');
    }
}

例如,如果我要通过控制台在数据库中创建两个事件,

events is an Array(2) with indices
- 0: {name: "my_event", date: "2019-06-04", id: "c017c392d446d4b2"}
- 1: {name: "my_event_2", date: "2019-06-04", id: "6d655ac8dd02e3fd"},

events.length returns 0,
and events[0] returns undefined.

这是为什么,我该如何解决?

最佳答案

发生这种情况的可能原因是因为 JS 的异步性质,这意味着所有 console.log 语句都在 listAllEvents() 成功执行之前执行 函数,

所以我的建议是尝试使用 promise ,并仅在 listAllEvents() 函数返回 promise 时执行在该函数之后提到的所有操作。

您也可以尝试使函数异步并使用 await 等待其成功执行。 (Much Smarter Choice 将使用异步)

Link to ASYNC Functions and Usage Link to Promises

您还可以通过执行 console.log(row) 将行推送到数组来检查答案的有效性。您会观察到 console.log(row) 将在打印事件和其他日志语句之后最后执行。

关于javascript - javascript 中的对象数组未按预期返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56572848/

相关文章:

javascript - ASP.NET Razor 页面中出现未终止的字符串常量错误

javascript - 从 JS 对象数组中删除元素

javascript - 使用 jQuery 附加 EJS 部分

Java - 将数组直接传递到构造函数中,而不是作为变量

javascript - 如何从 mySQL 中检查编辑页面的正确复选框?

javascript - 返回字符串的数字函数

javascript - MEAN 应用程序中 UI 路由器上的嵌套 View

jquery - 如何使用 JQuery 将焦点设置在输入字段上

c - 如何将 char 数组重置为 NULL(空)

javascript - 使用 javascript/jquery 从 json 变量获取 json 字符串名称