Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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 将变量传递给另一个函数_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 将变量传递给另一个函数

Javascript 将变量传递给另一个函数,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我得到的是“客户未定义”。我可以看到没有为函数定义客户机,但我不确定如何将客户机传入异步。我认为我实际上并没有将每个正确的值返回给pg_commit,或者是我 基本上,我希望有一个查询数组,在它们上面循环,使它们成为查询,然后在所有查询完成后,将它们作为事务提交 var pg_conn_str = "postgres://postgres:5432@localhost/test2"; var pg = require ('pg'); var rollback = function (clie

我得到的是“客户未定义”。我可以看到没有为函数定义客户机,但我不确定如何将客户机传入异步。我认为我实际上并没有将每个正确的值返回给pg_commit,或者是我

基本上,我希望有一个查询数组,在它们上面循环,使它们成为查询,然后在所有查询完成后,将它们作为事务提交

var pg_conn_str = "postgres://postgres:5432@localhost/test2";

var pg = require ('pg');

var rollback = function (client, done) {
    client.query ('ROLLBACK', function (err) {
            return done (err);
    });
};

var queries = ["INSERT INTO foo (bar) VALUES (4)",
               "INSERT INTO foo (bar) VALUES (5)"];

pg.connect (pg_conn_str, function (err, client, done) {
        if (err) throw err;
        client.query ('BEGIN', function (err) {
                if (err) return rollback (client, done);
                process.nextTick (function() {
                        if (err)
                console.log (err);

            async.each (queries, pg_commit, function () {
                                client.query ('COMMIT', done);
                console.log ('done');
                            });



                    }); //nextTick                                              
            }); //begin                                                         
    }); //connect                                                               

function pg_commit (val) {
    client.query (val, function (err) {
            if (err) return rollback (client, done);
        });
    return (val);
}

问题是
client
变量仅在
pg.connect
方法调用的回调函数中定义(作为其参数)。但是在
pg_commit
中,此名称没有意义,因为此函数不在回调函数的范围内定义,并且无权访问其名称绑定

因此,您有两种解决方案:要么将
pg_commit
定义移动到回调中

function (err, client, done) {
     if (err) throw err;
     var pg_commit = function(val) { client.query(val, function(err) { ... }};
     // ...
。。。或者将其保留在现在的位置,但将其更改为函数生成器:

function pg_commit_generator(client) {
  return function(val) { client.query(val, function(){}); /*...*/ }
}
。。。然后使用此生成器创建一个由
async调用的函数。每个

async.each(queries, pg_commit_generator(client), function() {...});
或者,您可以只向
async.each
提供调用
pg_commit
的匿名函数:

async.each(queries, function(val) { return pg_commit(val, client); }, ...);

。。。并相应地调整
pg_commit
(这样它将把
client
作为第二个参数)。

O.K.所以我创建了调用pg_commit的匿名函数。这似乎打印出了我想要的内容,但我如何有一个回调来知道所有的async.each都已完成?来自doc:
[third argument]-在所有迭代器函数完成或发生错误后调用的回调。