Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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)
параллельно, может тогда коннект и запрос уже синхронно выполнять надо?
Ответить с цитированием
  #2 (permalink)  
Старый 09.04.2014, 14:12
Аватар для Илья Кантор
Администратор
Отправить личное сообщение для Илья Кантор Посмотреть профиль Найти все сообщения от Илья Кантор
 
Регистрация: 25.05.2007
Сообщений: 1,221

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

правильным был бы следующий вывод:

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': 'SERVER1' } ]
query to Driver={SQL Server};Server=10.9.2.1;Database=DataBase2;UID=log ;PWD=pwd;
[ { 'SrvName': 'SERVER2' } ]

Не 2 раза вывод имени 2го сервера SERVER2, а по одному выводу имени каждого сервера SERVER1 и SERVER2.

в моем же случае получается что query 2 раза отрабатывает на последнем коннекте...
Не пойму почему...
Ответить с цитированием
  #4 (permalink)  
Старый 09.04.2014, 16:06
Аватар для nice_try
Профессор
Отправить личное сообщение для nice_try Посмотреть профиль Найти все сообщения от nice_try
 
Регистрация: 11.12.2013
Сообщений: 313

попробуй использовать eachSeries вместо each
Ответить с цитированием
  #5 (permalink)  
Старый 09.04.2014, 16:08
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

for (var i = 10; i--; ){

  setTimeout(function(){alert(i)}, 10);
}

Ничего не напоминает? учить замыкания - http://learn.javascript.ru/functions-closures

Последний раз редактировалось dmitriymar, 09.04.2014 в 16:12.
Ответить с цитированием
  #6 (permalink)  
Старый 10.04.2014, 09:19
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

dmitriymar,
если честно, я не совсем понял, что вы имели ввиду...
2 раза перечитал про замыкания.
можно немного конкретики?
Ответить с цитированием
  #7 (permalink)  
Старый 10.04.2014, 09:20
Интересующийся
Отправить личное сообщение для ascherbakov Посмотреть профиль Найти все сообщения от ascherbakov
 
Регистрация: 12.03.2014
Сообщений: 20

nice_try,
так eachSeries последовательно ф-и запускает, а мне надо именно параллельно
это в примере у меня 2 сервера надо обойти, а в реальной жизни их более 20 и ф-я получения данных с каждого довольно тяжеловата...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ответа сервера через iframe и xhr. Помогите разобраться. Arconas AJAX и COMET 0 26.02.2013 10:38
Помогите пожалуйста девушке разобраться Feni4ka jQuery 10 26.04.2011 19:25
Помогите пожалуйста разобраться Kupu4 Ваши сайты и скрипты 0 21.01.2010 10:44
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24
Помогите разобраться с задачей (поиск строки) Absinthe Ваши сайты и скрипты 6 07.12.2009 09:17