在数据库中填充after-promise解析文本文件



我正试图用bluebird和sqlite3构建一个数据库,以管理大量的"配料";。到目前为止,我已经成功地解析了一个文件,并使用regex从中推断出一些数据。

每当一行与我想在数据库中搜索的regex匹配时,如果已经插入了具有相同名称的元素,则跳过该元素,否则必须插入该元素。问题是某些元素被多次插入。代码部分有效,我说它部分有效,因为如果我删除检查是否存在同名元素的代码行,重复的行会多得多。

这是一段代码:

lineReader.eachLine(FILE_NAME, (line, last, cb) => {
let match = regex.exec(line);
if (match != null) {
let matchedName = match[1].trim();
//This function return a Promise for all the rows with corresponding name
ingredientsRepo.getByName(matchedName)
.then((entries) => {
if (entries.length > 0) {
console.log("ALREADY INSERTED INGREDIENT: " + matchedName)
} else {
console.log("ADDING " + matchedName)
ingredientsRepo.create(matchedName)
}
})   
}
});

我知道我错过了一些关于Promises的东西,但我不明白我做错了什么。

这是getByName(name)create(name)的代码:

create(name) {
return this.dao.run(
`INSERT INTO ingredients (name) VALUES (?)`,
[name]
)
}

getByName(name) {
return this.dao.all(
'SELECT * FROM ingredients WHERE name == ?',
[name]
)
}

ingredientsRepo.getByName(matchedName)返回一个promise,这意味着它是异步的。我还猜测ingredientsRepo.create(matchedName)是异步的,因为您正在向数据库中插入一些内容。

您的循环不会等待这些异步函数完成。因此,当第一次迭代调用.then(...)时,循环可能已经处于第50次迭代。

假设前10个元素具有相同的名称。好吧,由于异步函数需要一些时间才能完成,所以直到循环的第20次迭代,名称才会插入到DB中。因此,对于前10个元素,DB中不存在名称。

这是个时间问题。

最新更新