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

javascript中的对象数组未按预期返回,javascript,jquery,arrays,sqlite,Javascript,Jquery,Arrays,Sqlite,我有一个函数,它返回Javascript中的对象列表,我从另一个函数调用这个函数,并尝试使用其中的一些值,但每当我尝试访问这些值时,它们都会返回未定义的值 这是我生成列表的函数——其思想是,如果它不存在,它将创建一个sqlite3数据库,并返回一个包含每个事件的数组 function listAllEvents() { const sqlite3 = require('sqlite3').verbose(); const db = new sqlite3.Database('sc

我有一个函数,它返回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>');
    }
}

这是为什么?我能做些什么来修复它?

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

因此,我的建议是尝试使用承诺,仅当函数返回承诺时,才执行
listAllEvents()
函数后面提到的所有操作

您还可以尝试使函数异步,并使用wait等待其成功执行(更明智的选择是使用异步)


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

问题是您的函数在设置值之前返回变量。
db.serialize
函数将异步运行(在程序的正常流之外),并且返回语句将在之后立即运行。您可以将async/await与
Promise
结合使用。在这种情况下,变量
results
将等待承诺得到解决,然后继续下一行

async function listAllEvents() {    
    const selectionArray = [];

    let promise = new Promise( function (resolve, reject) {
        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) {
                    // add code here to reject promise
                    throw err;
                }

                rows.forEach((row) => {
                    selectionArray.push(row);
                });
                resolve(selectionArray);// resolve the promise
            });
        });
    });

    let results = await promise;
    return results; 
};

async function displayUpcomingEvents() {
    const events = await 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>');
    }
}
异步函数listalEvents(){
常量selectionArray=[];
让承诺=新承诺(功能(解决、拒绝){
db.serialize(()=>{
db.run(
创建表(如果不存在)todo(
名称文本,
日期文本,
id文本主键
)
);
db.all('SELECT*FROM todo ORDER BY date',[],(err,rows)=>{
如果(错误){
//在此处添加代码以拒绝承诺
犯错误;
}
rows.forEach((row)=>{
选择Ray.push(行);
});
解析(selectionaray);//解析承诺
});
});
});
让结果=等待承诺;
返回结果;
};
异步函数displayUpcomingEvents(){
const events=等待列表事件();

//console.log(events);与您的问题无关,但我建议您更改数组的
events
名称。您几乎碰到了
event
:可能存在重复的
async function listAllEvents() {    
    const selectionArray = [];

    let promise = new Promise( function (resolve, reject) {
        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) {
                    // add code here to reject promise
                    throw err;
                }

                rows.forEach((row) => {
                    selectionArray.push(row);
                });
                resolve(selectionArray);// resolve the promise
            });
        });
    });

    let results = await promise;
    return results; 
};

async function displayUpcomingEvents() {
    const events = await 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>');
    }
}