@cat_crash

NodeJS: Как написать правильно функцию возвращающую Json объект?

Хочу передавать метрики с железки, на которой крутится NodeJS. Метрики собираются разными библиотеками под NodeJS
Задача - раз в 5 секунд кидать JSON объект содержащий данные
Как задачу решить в классическом синхронном языке для меня не загадка. Но с нодой такой подход не работает.

Пример который "побеждаю"
...
//Делать замер каждые 3 секунды
setInterval(function(){
    var data = getData();
}, 3000);

function getData(){
sensor.read(11, 6, function(err, temperature, humidity) {
        if (!err) {
            h=humidity.toFixed(1);
            t=temperature.toFixed(1);
        }
    });

    os.cpuUsage(function(v){
        cpu=v*100;
    });

    os.cpuFree(function(v){
        cpu2=v*100;
    });

    totalmem=os.totalmem();
    freemem=os.freemem();

    var ret={
        'freemem':freemem,
        'totalmem':totalmem,
        'temp':t,
        'hum':h,
        'cpu':cpu,
        'cpu2':cpu2,
    };
return ret;
}


...
дальше отправка данных data в setInterval
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Abcdefgk
Может, так (но это не точно):
setInterval(function(){
  getData().then( data => {
    console.log(data);
  });
}, 3000);

async function getData() {
  var [h, t] = await new Promise( resolve => {
    sensor.read(11, 6, function(err, temperature, humidity) {
            resolve( [humidity.toFixed(1), temperature.toFixed(1)] );
    });
  });

  var cpu = await new Promise( resolve => {
    os.cpuUsage(function(v){
        resolve(v*100);
    });
  });

  var cpu2 = await new Promise( resolve => {
    os.cpuFree(function(v){
        resolve(v*100);
    });
  });

  var totalmem = os.totalmem();
  var freemem = os.freemem();

  var ret = {
    freemem: freemem,
    totalmem: totalmem,
    temp: t,
    hum: h,
    cpu: cpu,
    cpu2: cpu2,
  };
  return JSON.stringify(ret);
}
Ответ написан
eternalSt
@eternalSt
Доброго времени суток!

У тебя в коде есть ряд ошибок, которые происходят именно из-за не понимания, того как работает асинхронность в Node JS. Посмотри вот этот курс Ильи Кантора по NodeJS (смотри 20-21 видео) там всё подробно рассказано про асинхронность.

И сам сможешь написать рабочий код.

P.S. После того как поймёшь всё и вся про callback. Изучи генераторы, promise и async function.
P.P.S Если вообще никак не получится разобраться. То говори, решим вопрос =) А пока попробуй сам разобраться.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
OneTwoTrip! Москва
от 120 000 до 200 000 руб.
MobileUp Санкт-Петербург
от 100 000 руб.
D2C.io Екатеринбург
от 70 000 руб.
14 авг. 2018, в 16:33
1000 руб./за проект
14 авг. 2018, в 16:15
6000 руб./за проект
14 авг. 2018, в 16:12
500 руб./за проект