我使用node.js搜索sqlite书籍表并仅返回未签出的书籍。我的问题是,我传入stmt.each()的第二个函数是否会在执行之前等待isCheckedOut()完成?
目前它似乎在等待,但我担心如果isCheckedOut()需要更长的时间来执行(即:更大的数据库),那么第二个函数将运行得太早并且不会返回所有结果
如果第二个功能过早运行,我怎么能让它等待?
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('database');
function showAvailableBooks(callback) {
var stmt = db.prepare("SELECT * FROM books");
var results = [];
stmt.each(function (err, row) {
isCheckedOut(row.Barcode, function (err, checkedOut) {
if (!checkedOut) {
results.push({Title: row.Title, Author: row.Author, CallNumber: row.CallNumber});
}
});
}, function () {
callback(results);
});
}
showAvailableBooks(function () {
console.log("# of results: " + results.length);
});
答案 0 :(得分:0)
不,如果延迟,stmt.each不会等待所有的isCheckedOut调用来运行他们的回调。现在,sqlite(没有网络延迟)和小型数据库它可能会工作,但如果你尝试不同的,远程或更大的数据库,它可能不会。
Rob W在这里使用计数器回答了类似的问题:https://stackoverflow.com/a/21185103/4925989,但还有其他方法可以让你的完成回调等待。