我是 JavaScript 新手,我正在尝试执行以下操作。我想迭代一个列表,并进行依赖于列表中的项目的数据库调用。显然,由于调用是异步的,因此当 for 循环结束时,没有返回任何调用,因此列表为空。
在 C# 中,我可以等待数据库调用,这样就可以正常工作。我尝试在 javascript 中找到类似的方法,但运气不佳
exports.methodName = (req, res) => {
var itemsToReturn = []
for (let item of list) {
db.all(sql), (err, rows) => {
itemsToReturn.push(rows)
}
}
res.json(itemsToReturn )
}
我使用 SQLite 作为数据库
最佳答案
在 Javascript 中执行此操作的现代方法是为 db.all()
使用或创建一个 Promise 接口(interface)(而不是您显示的回调接口(interface)),然后使用 Promise。 all()
上的一个 promise 数组,用于了解所有异步操作何时完成。您没有说明您的数据库是什么,因此我们无法就您的数据库是否已经具有 Promise 接口(interface)(很多现在都有)提供任何帮助。
以下是假设 list
是一个数组的手动操作方法:
exports.methodName = (req, res) => {
let itemsToReturn = [];
let cntr = 0;
for (let [index, item] of list.entries()) {
db.all(sql), (err, rows) => {
if (err) {
// insert error handling here
} else {
itemsToReturn[index] = rows;
++cntr;
if (cntr === list.length) {
res.json(itemsToReturn);
}
}
}
}
}
假设您的数据库有一个名为 db.allPromise()
的 Promise 接口(interface),您可以执行以下操作:
exports.methodName = (req, res) => {
Promise.all(list.map(item => {
return db.all(someSql);
})).then(results => {
res.json(results);
}).catch(err => {
res.sendStatus(500);
});
}
关于javascript - 使用异步调用在 for 循环中构建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41919257/