@Tolych

Как организовать параллельное исполнение кода?

Добрый день!

Никак не могу понять почему не возвращается результат:
Вот исходники:
var async = require('async'); // подключаем библиотеку

var procedure = function(mon, tue, wed, thu, fri, sat, sun, buksumm, ID, sql, callback){

    var conn = new sqlDb.Connection(settings.dbConfig);
    conn.connect()
    .then(function(){
        var req = new sqlDb.Request(conn);
        //req.verbose = true;
        req.input('mon', mon);
        req.input('tue', tue);
        req.input('wed', wed);
        req.input('thu', thu);
        req.input('fri', fri);
        req.input('sat', sat);
        req.input('sun', sun);
        req.input('BUKING', buksumm);
        req.input('IDCity', ID);
        req.execute(sql)
        .then(function(data){
          conn.close();
          callback(null, data[0]); // use CPS, pass error as first argument, if any
        })
        .catch(function(err){
          //console.log(err);
          conn.close();
          callback(err, null); // use CPS, pass error as first argument, if any
        });
    })
    .catch(function(err){
        //console.log(err);
        conn.close();
        callback(err, null); // use CPS, pass error as first argument, if any
    });
};

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

Так как на клиентской форме может быть выбрано n-ое количество точек, то запрос к нам придет в виде массива данных. К примеру, такой, если выбраны две точки:
var testArray = [{
  "mon" : 1,
  "tue" : 1,
  "wed" : 1,
  "thu" : 1,
  "fri" : 1,
  "sat" : 1,
  "sun" : 1,
  "buksumm": 1000,
  "ID": "FBAF60C0-7330-4B93-A944-048FCB74DA2C"
},{
  "mon" : 2,
  "tue" : 2,
  "wed" : 2,
  "thu" : 2,
  "fri" : 2,
  "sat" : 2,
  "sun" : 2,
  "buksumm": 2000,
  "ID": "8D264BAC-19C5-429A-B11F-D5891409F81E"
}];

Далее, я хочу исполнить хранимую процедуру N раз. Где N = количество выбранных точек. Для этого использую библиотеку async, метод parallel.
Вот пример кода её исполнения:
async.parallel([
    function(callback){
        setTimeout(function(){
            callback(null, 'one');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'two');
        }, 100);
    }
],
// optional callback
function(err, results){
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

Так как нам заранее неизвестно, сколько точек будет выбрано, создаю массив функций. Который в качестве параметра будет передан в async.
var arrayFunctions = [];
function getResults(array){//на входе принимает наш массив точек
  for (var i = 0; i < array.length; i++) {
    var setFunction = function(cb){
      var sql = "getByCityes"; //определяем наименование вызываемой хранимой процедуру
      procedure(array.mon, array.tue, array.wed, array.thu, array.fri, array.sat, array.sun, array.buksumm, array.ID, sql, cb);
    };
    arrayFunctions.push(setFunction);
  }
  async.parallel(arrayFunctions, function(err, results){
    if(err) console.log(err);
    console.log(results);
  });
};

Результат к сожалению возвращается такой:
[ [], [] ]
Хотя, если исполнить процедуры в mssql:
EXECUTE getByCityes 2,2,2,2,2,2,2,2000,'8D264BAC-19C5-429A-B11F-D5891409F81E'
EXECUTE getByCityes 1,1,1,1,1,1,1,1000,'FBAF60C0-7330-4B93-A944-048FCB74DA2C'

Результат возвращается.
На первый взгляд, может я что-то делаю не верно? И не стоило таким образом генерировать массив функций?
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
@iShatokhin
JS developer
А не проще ли было использовать async.map?

var sql = "getByCityes";
async.map(array, function (item, cb) { 
  procedure(item.mon, item.tue, item.wed, item.thu, item.fri, item.sat, item.sun, item.buksumm, item.ID, sql, cb);
}, function(err, results){
    if(err) console.log(err);
    console.log(results);
  });
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы