2016-08-31 2 views
0

Я борюсь с передачей концепции данных в Node.js. Давайте рассмотрим SQL как утомительный пример. Вот код из примеров:Передача аргументов через предопределенную функцию в Node.js

//acquire a connection 
pool.acquire(function poolAcquire(err, connection) { 
    if (err) { console.error(err); return; } 

    //use the connection as normal 
    var request = new Request('select 1;select 2;select 3', function requestCallback (err, rowCount) { 
     if (err) { console.error(err); return;} 

     console.log('rowCount: ' + rowCount); 

     //release the connection back to the pool when finished 
     connection.release(); 
    }); 

    request.on('row', function onRequestRow(columns) { 
     console.log('value: ' + columns[0].value); 
    }); 

    connection.execSql(request); 
}); 

pool.acguire принимает функцию в качестве аргумента, и эта функция имеет определенную подпись (ERR, соединение)

Мой вопрос - как я могу передать SQL заявление внутри этой функции? Я не могу изменить подпись, потому что не вызывается другая функция.

Также я не могу использовать глобальную область видимости, поскольку переменную можно изменить вне.

Другими словами, мне нужно найти способ обходить вызовы оболочек и передавать некоторые данные.

Что-то вроде

var mySQLs = ['select 1;select 2;select 3','select 4;select 5;']; 
async.forEach(mySQLs,WorkWithOneItem, AllIsDone); 

function WorkWithOneItem(item, callback){ 
    pool.acquire(?????(item)); 
    callback(); // tell async that the iterator has completed 
} 

function AllIsDone (err) { 
    console.log('All done'); 
} 

ответ

2

обернув его в другой функции:

function aquire(sql, callback) { 
    pool.acquire(function poolAcquire(err, connection) { 
     if (err) { console.error(err); return callback(); } 

     //use the connection as normal 
     var request = new Request(sql, function requestCallback (err, rowCount) { 
      if (err) { console.error(err); return;} 

      console.log('rowCount: ' + rowCount); 

      //release the connection back to the pool when finished 
      connection.release(); 
      callback(); 
     }); 

     request.on('row', function onRequestRow(columns) { 
      console.log('value: ' + columns[0].value); 
     }); 

     connection.execSql(request); 
    }); 
} 

function WorkWithOneItem(item, callback){ 
    acquire(item,() => { 
     callback(); // tell async that the iterator has completed 
    }); 
} 
1

вам нужны результаты, как хорошо ли?

var mySQLs = ['select 1;select 2;select 3','select 4;select 5;']; 
async.forEach(mySQLs, WorkWithOneItem, AllIsDone); 

function WorkWithOneItem(sql, callback){ 
    pool.acquire(function poolAcquire(err, connection) { 
     if (err) return callback(err); 

     //use the connection as normal 
     var request = new Request(sql, function requestCallback (err, rowCount) { 
      if (err) return callback(err); 

      console.log('rowCount: ' + rowCount); 

      //release the connection back to the pool when finished 
      connection.release(); 
     }); 

     var rows = []; 
     var count = 0; 
     request.on('row', function onRequestRow(columns) { 
      console.log('value: ' + columns[0].value); 
      rows.push(columns[0].value); // or whatever you actually want out of these. 
     }); 

     request.on('done', function onRequestDone() { 
     callback(null, rows); 
     }); 

     connection.execSql(request); 
    }); 
    callback(); // tell async that the iterator has completed 
} 

function AllIsDone (err) { 
    console.log('All done'); 
    // you probably want async.map, so you can get the result back 
    // as the second argument for a function like this 
}