Показать сообщение отдельно
  #1 (permalink)  
Старый 08.04.2014, 14:43
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

Асинхронный вызов, помогите разобраться?
Задача в следующем: надо параллельно запустить выполнение запроса к базе данных на нескольких удаленных серверах, после того как каждый из запросов отрабатывает, в консоль выводятся данные.
делаю так:
var arr = [{ SERVER_IP: '10.9.1.1',
                  DB_NAME: 'DataBase1' },
                { SERVER_IP: '10.9.2.1',
                  DB_NAME: 'DataBase2' }];

    async.each(arr, function(arrData, callback) {
//ф-я модуля async, получает на вход массив объектов
//и для каждого объекта вызывает function(arrData, callback)
        var ServerIp = arrData["SERVER_IP"];
        var DbName = arrData["DB_NAME"];

        var tmpConn = "Driver={SQL Server};Server=" + ServerIp + ";Database=" + DbName + ";UID=log;PWD=pwd;";
//динамически формирую строку коннекта 
//для каждого объекта массива
        console.log(tmpConn);
        srcDB.open(tmpConn, function (err) {
//ф-я модуля odbc, асинхронно открывает 
//коннект для текущей строки соединения
            console.log('connect to ' + tmpConn);
            if (err) {
                return console.log("Error!\n" + err);
            }

            var SQL =  "SELECT @@SERVERNAME as [SrvName]";
            srcDB.query(SQL, function (err, rows, moreResultSets) {
//ф-я модуля odbc, асинхронно выполняет запрос к базе
                console.log('query to ' + tmpConn);
                if (err) {
                    return console.log('Error!\n' + err);
                }
                console.log(rows);
            });
        });
        callback;
    }, callback);

в итоге в консоли имею следующее:
Код:
connect to Driver={SQL Server};Server=10.9.1.1;Database=DataBase1;UID=log;PWD=pwd;
connect to Driver={SQL Server};Server=10.9.2.1;Database=DataBase2;UID=log;PWD=pwd;
query to Driver={SQL Server};Server=10.9.1.1;Database=DataBase1;UID=log;PWD=pwd;
[ { 'SrvName': 'SERVER2' } ]
query to Driver={SQL Server};Server=10.9.2.1;Database=DataBase2;UID=log;PWD=pwd;
[ { 'SrvName': 'SERVER2' } ]
SERVER2 - имя сервера, сидящего на 10.9.2.1
т.е. запрос отрабатывает 2 раза, но на сервере, параметры для подключения на который, хранятся в последнем объекте массива...
что здесь не так?
где я просчитался?
быть может все дело в асинхронном открытии коннекта и запроса к базе?
если я и так запускаю
function(arrData, callback)
параллельно, может тогда коннект и запрос уже синхронно выполнять надо?
Ответить с цитированием