允许多个异步调用在Node.js中调用终止函数之前完成

时间:2015-05-21 17:14:06

标签: node.js sqlite

我使用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);
});

1 个答案:

答案 0 :(得分:0)

不,如果延迟,stmt.each不会等待所有的isCheckedOut调用来运行他们的回调。现在,sqlite(没有网络延迟)和小型数据库它可能会工作,但如果你尝试不同的,远程或更大的数据库,它可能不会。

Rob W在这里使用计数器回答了类似的问题:https://stackoverflow.com/a/21185103/4925989,但还有其他方法可以让你的完成回调等待。