Хотя L oop вызывает проблемы с зависанием .... какие-либо альтернативные методы цикла? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть код для веб-приложения, которое синхронизирует события данных с версией android приложения. Проблема, с которой я столкнулся, заключается в том, что он использует командлет SETINTERVAL для многократного возврата значения местоположения. Мне удалось установить командлет тайм-аута (SETTIMEOUT), чтобы он возвращал значение только один раз, но проблема в том, что если я установил его слишком низким, он не вернет значение, если я установил его слишком высоким, он не вернет значение, пока не истечет время SETTIMEOUT. Я пытаюсь получить значение функции CURRENTLOCATION, ЗАТЕМ применяю значение, как только оно вернуло значение. Я пробовал использовать

while (!location){}

, но когда он отправляет события данных на мой телефон, и я открываю эту запись, приложение зависает. Есть ли альтернативный способ l oop вернуться к началу функции и вызвать его снова, пока не будет выполнено условие (местоположение переменной)?

Вот код:

ON('load-record', function(event) {
  var updateLocationInfo = function() {
    // get the current device location
    var location = CURRENTLOCATION();

    // if there is no location, display a special message
    if (!location) {
      SETLABEL('gps_info', 'GPS Coordinates');
      return;
    }

    // format the display of the location data
    var message = [
      'Latitude: ' + location.latitude,
      'Longitude: ' + location.longitude
    ].join('\n');

    // set the label property of the label on the form
    SETLABEL('gps_info', 'GPS Coordinates');
    SETVALUE('gps_info', location)
  };

  // go ahead and update it now...
  updateLocationInfo();

  // ... and every 3 seconds
  SETINTERVAL(updateLocationInfo, 00001);
});

1 Ответ

0 голосов
/ 06 августа 2020

Текущее местоположение - это вызов API, который точка опоры использует для получения текущей информации GPS при вызове в приложении android.

Хорошо, поэтому это черный ящик, который возвращает местоположение, если доступно, в противном случае - нет. Тогда все, что вы можете сделать, это опросить и надеяться, что вы в конечном итоге получите значение.

ON('load-record', function (event) {
  var attempts = 0;

  var updateLocationInfo = function () {
    // get the current device location
    var location = CURRENTLOCATION();

    if (location) {
      // format the display of the location data
      var message = [
        'Latitude: ' + location.latitude,
        'Longitude: ' + location.longitude
      ].join('\n');

      // set the label property of the label on the form
      SETLABEL('gps_info', 'GPS Coordinates');
      SETVALUE('gps_info', location)

    } else if (attempts++ < 500) { // try it for approx 5s
      SETLABEL('gps_info', 'GPS Coordinates');
      SETTIMEOUT(updateLocationInfo, 10);

    } else {
      // you have to know when it's time to stop.

      // sry, didn't get the value
      // display your special message
    }
  };

  // go ahead and try it now...
  updateLocationInfo();
});

Чуть более сложный подход может быть:

ON('load-record', function (event) {
  // try to get the value for 5 seconds
  var endTime = Date.now() + 5000;
  // start with a 10ms interval
  var delay = 10;
  var updateLocationInfo = function () {
    if (location) {
      // ...
    } else if (Date.now() < endTime) {
      // slow down the polling, but cap it at max. 500ms interval
      SETTIMEOUT(updateLocationInfo, Math.min(delay *= 1.15, 500));
    } else {
      // ...
    }
  }

  updateLocationInfo();
})

Таким образом вы не опрашиваете всего 5 секунд каждые 10 мс. Начните с нетерпением в надежде, что вы быстро добьетесь успеха, но не спешите, чтобы не создавать такой большой нагрузки, если это займет немного больше времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...