@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
  • Вопрос задан
  • 219 просмотров
Пригласить эксперта
Ответы на вопрос 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 Если вообще никак не получится разобраться. То говори, решим вопрос =) А пока попробуй сам разобраться.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы