Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.09.2017, 06:18
Новичок на форуме
Отправить личное сообщение для shirokovea Посмотреть профиль Найти все сообщения от shirokovea
 
Регистрация: 15.09.2017
Сообщений: 4

Не вывести данные с помощью функции
Здравствуйте.
Есть функция, которая выводит данные из БД, но я не могу с этими данными работать. Хочу присвоить эти данные в переменную и обращаться к ним как к элементам массива.
var sql = "select * from table";

function getData(query, cb) {
    var mssql = require('mssql');
    var config = {
        ...
        }
    }
    var connection = new mssql.connect(config, function(err) {
        if (typeof err !== "undefined" && err !== null) {
            cb(err);
            return
        }

        var request = new mssql.Request(connection);
        request.query(query, function(err, recordset) {
            var data = {field1: [],field2: []};
            for(var i = 0; i < recordset.recordset.length; i++){
                data.field1.push(recordset.recordset[i].field1);
                data.field2.push(recordset.recordset[i].field2);
            }
            if (cb) {
                cb(null, data);
            }
            mssql.close();
        });
    });
}
var getArr = getData(sql);
console.log(getArr.field1[0]);
console.log(getArr.field2[0]);
Ответить с цитированием
  #2 (permalink)  
Старый 15.09.2017, 08:09
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,719

shirokovea, я не знаком с серверным js, но, судя по коду, функция «getData» принимает 2 параметра: сам запрос и callback-функцию.
Вероятно запрос к бд происходит асинхронно.
Чтобы получить данные и начать с ними работать, нужно использовать функцию примерно так:
getData(sql,function(_null,rows){
console.log(rows.field1[0]);
console.log(rows.field2[0]);
});


Сама функция несколько странная. Во-первых, непонятно почему она читает только 2 поля каждой строки вместо всех, во-вторых, непонятно зачем callback'у передавать первым аргументом null.

Как уже написал ранее, с серверным js я не знаком, поэтому могу ошибаться.
Ответить с цитированием
  #3 (permalink)  
Старый 15.09.2017, 09:43
Новичок на форуме
Отправить личное сообщение для shirokovea Посмотреть профиль Найти все сообщения от shirokovea
 
Регистрация: 15.09.2017
Сообщений: 4

Если использовать функцию так, то все работает. Но мне нужно сделать именно так:
var getArr = getData(sql);
console.log(getArr.field1[0]);
console.log(getArr.field2[0]);
Если такое вообще возможно. А по поводу функции, 2 поля это для примера. Передавать null не принципиально.
Ответить с цитированием
  #4 (permalink)  
Старый 15.09.2017, 09:45
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,719

Сообщение от shirokovea
Но мне нужно сделать именно так
не представляю как такое можно реализовать, видимо моих знаний недостаточно.
Возможно кто-нибудь другой сможет вам помочь.
Ответить с цитированием
  #5 (permalink)  
Старый 15.09.2017, 12:21
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от shirokovea Посмотреть сообщение
Если использовать функцию так, то все работает. Но мне нужно сделать именно так:
var getArr = getData(sql);
console.log(getArr.field1[0]);
console.log(getArr.field2[0]);
Конечно же, так сделать нельзя.

как вариант, слегонца переписать getData, чтобы возвращала промис.
тогда в коде можно будет использовать моднейшие хипстерские async/await, внешне это выглядит почти как то что надо.
Ответить с цитированием
  #6 (permalink)  
Старый 15.09.2017, 12:30
Новичок на форуме
Отправить личное сообщение для shirokovea Посмотреть профиль Найти все сообщения от shirokovea
 
Регистрация: 15.09.2017
Сообщений: 4

Сообщение от Alexandroppolus Посмотреть сообщение
Конечно же, так сделать нельзя.

как вариант, слегонца переписать getData, чтобы возвращала промис.
тогда в коде можно будет использовать моднейшие хипстерские async/await, внешне это выглядит почти как то что надо.
А может подсказать как именно переписать, а то я не совсем понял.
Ответить с цитированием
  #7 (permalink)  
Старый 15.09.2017, 12:41
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

примерно так. Вроде бы нода последних версий умеет async/await

var sql = "select * from table";

function getData(query) {
  return new Promise(function(resolve, reject) {
    var mssql = require('mssql');
    var config = {
        ...
        }
    }
    var connection = new mssql.connect(config, function(err) {
        if (typeof err !== "undefined" && err !== null) {
            reject(err);
            return
        }

        var request = new mssql.Request(connection);
        request.query(query, function(err, recordset) {
            if (err != null) {
              reject(err);
            } else {
              var data = {field1: [],field2: []};
              for(var i = 0; i < recordset.recordset.length; i++){
                  data.field1.push(recordset.recordset[i].field1);
                  data.field2.push(recordset.recordset[i].field2);
              }
              resolve(data);
            }
            mssql.close();
        });
    });
  });
}

async function main() {
  var getArr = await getData(sql);
  console.log(getArr.field1[0]);
  console.log(getArr.field2[0]);
}

main();
Ответить с цитированием
  #8 (permalink)  
Старый 18.09.2017, 07:11
Новичок на форуме
Отправить личное сообщение для shirokovea Посмотреть профиль Найти все сообщения от shirokovea
 
Регистрация: 15.09.2017
Сообщений: 4

Сообщение от Alexandroppolus Посмотреть сообщение
примерно так. Вроде бы нода последних версий умеет async/await

var sql = "select * from table";

function getData(query) {
  return new Promise(function(resolve, reject) {
    var mssql = require('mssql');
    var config = {
        ...
        }
    }
    var connection = new mssql.connect(config, function(err) {
        if (typeof err !== "undefined" && err !== null) {
            reject(err);
            return
        }

        var request = new mssql.Request(connection);
        request.query(query, function(err, recordset) {
            if (err != null) {
              reject(err);
            } else {
              var data = {field1: [],field2: []};
              for(var i = 0; i < recordset.recordset.length; i++){
                  data.field1.push(recordset.recordset[i].field1);
                  data.field2.push(recordset.recordset[i].field2);
              }
              resolve(data);
            }
            mssql.close();
        });
    });
  });
}

async function main() {
  var getArr = await getData(sql);
  console.log(getArr.field1[0]);
  console.log(getArr.field2[0]);
}

main();
А можно как-нибудь вынести переменную getArr из-под функции?
Что-нибудь наподобие:
async function main() {
    var getArr = await getData(sql);
    return getArr;
}

var bar = main();
console.log(bar.field[0]);

Если так пытаюсь сделать, то на выводе вижу Promise {<pending>}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как с помощью одного файла заменять данные во всех сайтах Дима1892 Ваши сайты и скрипты 2 11.01.2016 19:22
Проверить данные в функции, которая работает с другой функцией. Andrej_2 Общие вопросы Javascript 5 27.09.2012 22:42
Как вывести данные из PHP Sherminator Events/DOM/Window 2 07.08.2012 20:11
каким образом вывести текст с помощью SetTimeOut В DIV? bratkovsky Общие вопросы Javascript 2 04.08.2012 00:15
Нужно с помощью JS записывать данные в БД d!mm Общие вопросы Javascript 2 01.11.2008 18:36