2013-09-14 2 views
0

Я получаю «клиент не определен». Я вижу, что клиент не определен для функции, но я не уверен, как передать клиент в async. Я не думаю, что на самом деле возвращаю значение каждого из них для pg_commit или я?Передача переменных в другую функцию

В принципе, я хочу иметь массив запросов и цикл над ними и делать их запросы, а затем, когда все они совершают транзакции.

var pg_conn_str = "postgres://postgres:[email protected]/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); 
} 

ответ

0

Проблема заключается в том, что 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.each:

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 как вторые пары).

+0

O.K. поэтому я просматриваю анонимную функцию, вызывающую pg_commit. Кажется, что распечатывает то, что я хочу, но как мне получить обратный вызов, чтобы узнать, что все async.each завершены? – user983223

+0

Из [async.each] (https://github.com/caolan/async#each) doc: '[third argument] - обратный вызов, который вызывается после завершения всех функций итератора или произошла ошибка. – raina77ow

Смежные вопросы