Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在使用Nodejs调用回调函数之前等待N个查询完成_Javascript_Sql_Node.js_Postgresql_Promise - Fatal编程技术网

Javascript 如何在使用Nodejs调用回调函数之前等待N个查询完成

Javascript 如何在使用Nodejs调用回调函数之前等待N个查询完成,javascript,sql,node.js,postgresql,promise,Javascript,Sql,Node.js,Postgresql,Promise,我试图创建一个函数,该函数需要数据库并返回对象列表,对于每个对象,我需要查询数据库并返回所有查询的结果 如何等待所有查询完成,或者我应该以同步方式完成它们?如果是,怎么做?我不应该利用这一事实,即它们都是select查询,彼此不依赖,所以并行运行它们以优化时间?那是个糟糕的设计吗?或者我应该为此使用存储过程 getTopActiveUsers:function(callback) { pool.connect(function (err, client, done) {

我试图创建一个函数,该函数需要数据库并返回对象列表,对于每个对象,我需要查询数据库并返回所有查询的结果

如何等待所有查询完成,或者我应该以同步方式完成它们?如果是,怎么做?我不应该利用这一事实,即它们都是select查询,彼此不依赖,所以并行运行它们以优化时间?那是个糟糕的设计吗?或者我应该为此使用存储过程

getTopActiveUsers:function(callback) {
    pool.connect(function (err, client, done) {
        if (err)
            callback(null, err);
        else {
            User.finAll(client,function(users) {
                for(var i=0;i<users.length;i++) {
                    Application.findByUser(users[i].id,function(applications) {
                        // here i have the applications for user i
                    })
                }
                // need to call the callback function when all queries finishes
            })
        }
    });
}
getTopActiveUsers:函数(回调){
连接(函数(错误、客户端、完成){
如果(错误)
回调(null,err);
否则{
User.finAll(客户端、函数(用户){
for(var i=0;i异步库是为您准备的。并行方法并行执行您的所有请求,并等待它们全部完成

getTopActiveUsers : function(callback) {
pool.connect(function(err, client, done) {
    if (err) {
        callback(null, err);
    } else {
        User.finAll(client, function(users) {
            var requests = [];

            for (var i = 0; i < users.length; i++) {
                requests.push(function(asyncCallback) {
                    Application.findByUser(users[i].id, function(applications) {
                        // here i have the applications for user i
                        asyncCallback();
                    });
                });

            }

            async.parallel(requests, function(err) {
                // Requests are finished here
            });
        })
    }
});
}
getTopActiveUsers:函数(回调){
连接(函数(错误、客户端、完成){
如果(错误){
回调(null,err);
}否则{
User.finAll(客户端、函数(用户){
var请求=[];
对于(var i=0;i
文档:异步库是为您准备的。并行方法并行执行所有请求,并等待它们全部完成

getTopActiveUsers : function(callback) {
pool.connect(function(err, client, done) {
    if (err) {
        callback(null, err);
    } else {
        User.finAll(client, function(users) {
            var requests = [];

            for (var i = 0; i < users.length; i++) {
                requests.push(function(asyncCallback) {
                    Application.findByUser(users[i].id, function(applications) {
                        // here i have the applications for user i
                        asyncCallback();
                    });
                });

            }

            async.parallel(requests, function(err) {
                // Requests are finished here
            });
        })
    }
});
}
getTopActiveUsers:函数(回调){
连接(函数(错误、客户端、完成){
如果(错误){
回调(null,err);
}否则{
User.finAll(客户端、函数(用户){
var请求=[];
对于(var i=0;i

文档:

由于这些都可以并行运行,因此使用现有代码的最简单方法就是保留一个计数器:

getTopActiveUsers:function(callback) {
    pool.connect(function (err, client, done) {
        if (err)
            callback(null, err);
        else {
            User.findAll(client,function(users) {
                var doneCnt = 0;
                for(var i=0;i<users.length;i++) {
                    Application.findByUser(users[i].id,function(applications) {
                        // here i have the applications for user i
                        ++doneCnt;
                        if (doneCnt === users.length) {
                            callback(null, someResult);
                        }
                    })
                }
            })
        }
    });
}
getTopActiveUsers:函数(回调){
连接(函数(错误、客户端、完成){
如果(错误)
回调(null,err);
否则{
User.findAll(客户端,函数(用户){
var doneCnt=0;

对于(var i=0;i,由于这些都可以并行运行,因此使用现有代码的最简单方法就是只保留一个计数器:

getTopActiveUsers:function(callback) {
    pool.connect(function (err, client, done) {
        if (err)
            callback(null, err);
        else {
            User.findAll(client,function(users) {
                var doneCnt = 0;
                for(var i=0;i<users.length;i++) {
                    Application.findByUser(users[i].id,function(applications) {
                        // here i have the applications for user i
                        ++doneCnt;
                        if (doneCnt === users.length) {
                            callback(null, someResult);
                        }
                    })
                }
            })
        }
    });
}
getTopActiveUsers:函数(回调){
连接(函数(错误、客户端、完成){
如果(错误)
回调(null,err);
否则{
User.findAll(客户端,函数(用户){
var doneCnt=0;
对于(var i=0;i