Не выходит из setInterval

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем pingyaru, 27 ноя 2016.

  1. pingyaru

    pingyaru Нерд

    Здравствуйте! Решил выполнить задание из набора "Йодо". Задача: имеется кнопка и термометр, при нажатии кнопки, должна изменяться единица измерения температуры. Проблема в том, что микроконтроллер не хочет выходить из предыдущего интервала и переходить к следующему. Вместо этого, он просто добавляет другой интервал.
    Код (Javascript):
    var thermometer = require('http://js.amperka.ru/modules/@amperka/thermometer.js')
    .connect(A4);

    var button = require('http://js.amperka.ru/modules/@amperka/button.js')
    .connect(P1);

    var a = -1;

    button.on('press', function() {

    a++;
    if(a == 3) {
      a = 0;
    } //если а == 0, то показывать °С. Если а == 1, то показывать °К. Если а == 2, то показывать °F.


    if (a == 0) {
    var cel = setInterval(function() {
      var celsius = thermometer.read('C');
      console.log(
        'Temperature =', celsius.toFixed(1), '°C');
    }, 1000);

      if(a == 1) {
        clearInterval(cel); } //выход из интервала
    }



    else if(a == 1){
      var kel = setInterval(function() {
      var celsius = thermometer.read('C');
      var kelvin = celsius - 273.15;
      console.log(
        'Temperature =', kelvin.toFixed(1), '°K');
    }, 1000);

       if(a == 2) {
        clearInterval(kel); } //выход из интервала
      }



    else if (a == 2){
    var far = setInterval(function() {
      var celsius = thermometer.read('C');
      var farengeyt = celsius * 1.8 + 32;
      console.log(
        'Temperature =', farengeyt.toFixed(1), '°F');
    }, 1000);

      if(a == 0) {
        clearInterval(far); } //выход из интервала
      }
    });
    В итоге получается такая бурда:

    [​IMG]
    Может, кто-нибудь сможет подсказать, решения :)
     
  2. rkit

    rkit Гуру

    У вас код с clearInterval недостижим. Оформите код как положено, и станет понятно.
     
  3. pingyaru

    pingyaru Нерд

    Прошу прощения, мои навыки в программировании очень скудны) Но при попытке вынести clearInterval за пределы setInterval, ругаются, что clearInterval вынесли за скобки.
    Код (Java):
    if (a == 0) {
    var cel = setInterval(function() {
      var celsius = thermometer.read('C');
      console.log(
        'Temperature =', celsius.toFixed(1), '°C');
    }, 1000);
    }
      if(a == 1) {
        clearInterval(cel); } //выход из интервала




    else if(a == 1){
      var kel = setInterval(function() {
      var celsius = thermometer.read('C');
      var kelvin = celsius - 273.15;
      console.log(
        'Temperature =', kelvin.toFixed(1), '°K');
    }, 1000);
    }
       if(a == 2) {
        clearInterval(kel); } //выход из интервала




    else if (a == 2){
    var far = setInterval(function() {
      var celsius = thermometer.read('C');
      var farengeyt = celsius * 1.8 + 32;
      console.log(
        'Temperature =', farengeyt.toFixed(1), '°F');
    }, 1000);
    }
      if(a == 0) {
        clearInterval(far); } //выход из интервала
    Был бы благодарен, если расскажете поподробней :)
     
  4. pingyaru

    pingyaru Нерд

    В итоге спустя долгого ковыряния в коде и кучу перерытых форумов, методом научного тыка решил задачу.
    Код (Javascript):
    button.on('press', function() {

    a++;
    if(a == 3) {
      a = 0;
    } //если а == 0, то показывать °С. Если а == 1, то показывать °К. Если а == 2, то показывать °F.


    if (a == 0) {
      clearInterval(this.far);
      var cel = setInterval(function() {
      var celsius = thermometer.read('C');
      console.log(
        'Temperature =', celsius.toFixed(1), '°C');
    }, 1000);
    }

    if(a == 1){
      clearInterval(this.cel);
      var kel = setInterval(function() {
      var celsius = thermometer.read('C');
      var kelvin = celsius - 273.15;
      console.log(
        'Temperature =', kelvin.toFixed(1), '°K');
    }, 1000);
    }
     
    if (a == 2){
      clearInterval(this.kel);
      var far = setInterval(function() {
      var celsius = thermometer.read('C');
      var farengeyt = celsius * 1.8 + 32;
      console.log(
        'Temperature =', farengeyt.toFixed(1), '°F');
    }, 1000);
    }

    });
    Все работает, и при нажатии на кнопку переключает единицы измерения. Но появилась новая маленькая проблема: при нажатии на кнопку выскакивает "ашипка"
    "
    Uncaught Error: Unknown Timeout
    at line 1 col 236
    ...Timeout(this._holdTimeoutID),this._holdTimeoutID=null,this.e...
    ^
    "
    и затем идёт показ температуры.
    Может кто-нибудь знает, как её можно решить? Было бы круто довести проектик до конца)
     
  5. DrOnJD

    DrOnJD Нерд

    Ну дык там же написано, что неизвестен таймаут. Может просто проверять его наличие?
     
  6. Helot

    Helot Нуб

    если заменить "button.on('press' " на button.on('click' - то вроде как работает)

    только вот кельвины вы неправильно считаете, поменяйте " -" на "+" в формуле
     
    Последнее редактирование: 12 мар 2017
  7. FomaLSSJ

    FomaLSSJ Нерд

    Думаю оптимальнее если один интервал за все будет работать:
    Код (Javascript):
    button.on('press', () => {
      if (++a > 2) a = 0;
    });

    getType = (temperature) => {
      switch (a) {
        case 0:
          return 'Temperature: ' + temperature.toFixed(1) + '°C';
        case 1:
          return 'Temperature: ' + (temperature + 273.15).toFixed(1) + '°K';
        case 2:
          return 'Temperature: ' + (temperature * 1.8 + 32).toFixed(1) + '°F';
      }
    };

    setInterval(() => print(getType(thermometer.read('C'))), 1000);
     
    Helot нравится это.
  8. Helot

    Helot Нуб


    что-то ошибку выдаёт :

    Uncaught SyntaxError: Got ')' expected EOF
    at line 10 col 21
    button.on('press', () => {
    ^
     
  9. FomaLSSJ

    FomaLSSJ Нерд

    Последняя прошивка стоит? В ней добавились возможности из ES5.
     
    Helot нравится это.
  10. Helot

    Helot Нуб

    Перепрошил - все заработало.
    Спасибо!!!