Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Асинхронная функция (https://javascript.ru/forum/node-js-io-js/73536-asinkhronnaya-funkciya.html)

Artur_Hopf 24.04.2018 09:04

Асинхронная функция
 
Добрый день. Есть асинхронная функция которая берет данные из таблицы.
Если я напишу так, результат выведется в консоль, все хорошо, данные есть:

const config = {
    user: 'user',
    password: 'password',
    server: 'server',
    database: 'database'
};

async function data() {
    try {
        let pool = await connect(config);
        
        let result = await pool.request()
            .query('select * from table');

        console.log(result);
        
    } catch (err) {
        console.log(err);
    };
};


Но в консоле мне от них толку мало, вывожу так, результат не выводится:
async function data() {
    try {
        let pool = await connect(config);
        
        let result = await pool.request()
            .query('select * from table');

        return result;
        
    } catch (err) {
        console.log(err);
    };
};

console.log(data);


В чем может быть дело, return возвращает вот это в консоль :-? :
[AsyncFunction: data]

destus 24.04.2018 09:16

Artur_Hopf,
data().then(console.log).catch(console.error)

Artur_Hopf 24.04.2018 09:21

destus,
Вывелось спасибо.:thanks:

Artur_Hopf 24.04.2018 09:41

destus,
Подскажи пожалуйста, я с этой функции хочу вывести с помощью socket.io таким образом:
io.on('connection', function(socket){    
    socket.emit('data1', data);
});

//на клиенте получаю это:

var socket = io();
socket.on('data1', function (data) {
console.log(data);
});


В консле на клиенте пустой объект {} . Что я не так делаю?:(
Тестовые данные типо var array = [] передаются нормально, то есть socket работает.

destus 24.04.2018 09:43

Artur_Hopf,
2 строка откуда data?
Может так
io.on('connection', function(socket){    
    data().then(response => socket.emit('data1', response));
});

Artur_Hopf 24.04.2018 09:50

destus,
С другого файла где эта функция делаю экспорт:
exports.data = data;


Запускаю на основном файле:
const model = require('./model');


Передаю экспортированную функцию:
const data = model.data ();


Проверяю что данные передаются вашим методом:
data .then(console.log).catch(console.error);


Данные есть, далее передаю из сокетом, и вот в этом месте данные теряются, но сокет работает передавал массивы:
io.on('connection', function(socket){    
    socket.emit('data1', data);
});


Ну и принимаю на клиенте:
var socket = io();
socket.on('data1', function (data) {
console.log(data);
});


Ошибок никаких нет, просто приходит пустой массив.

Artur_Hopf 24.04.2018 09:56

destus,
Не выходит, ладно методом проб разберусь, если что ответ скину :-?

destus 24.04.2018 09:57

Artur_Hopf,
io.on('connection', function(socket){   
    data.then(response => socket.emit('data1', response));
});

Artur_Hopf 24.04.2018 10:00

destus,
Отлично, спасибо друг :yes: :thanks:

Artur_Hopf 24.04.2018 11:28

destus,
Не можешь подсказать об обновлении данных?
С функции мы передали данные на страницу, я воткнул set interval:
io.on('connection', function(socket){  
    setInterval(function() {
    data.then(response => socket.emit('data1', response));
    }, 1000);
});


У клиента вывел в консоль:
var socket = io();
socket.on('data1', function (data) {
console.log(data);
});

Да, ежесекундно с сервера приходят данные, но они не обновляются, при старте сервера он делает запрос и все, отдает то что получил, думаю проблема в асинхронной функции:
async function data() {
    try {
        let pool = await connect(config);
        
        let result = await pool.request()
            .query('select * from table');

        return result;
        
    } catch (err) {
        console.log(err);
    };
};


Если я прямо после нее делаю так:
setInterval(function() {
     data().then(console.log).catch(console.error);
}, 1000);

После первого опроса выводит результат, а дальше ошибки:

Error: Global connection already exists. Call sql.close() first.

Получается мне надо переделать функцию, или можно оставить и обновлять данные по другому?:-?

В базе данные обновляются без моего вмешательства.


Часовой пояс GMT +3, время: 08:52.