我有一个返回 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/