Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.08.2018, 23:37
Новичок на форуме
Отправить личное сообщение для Artem_Andreev Посмотреть профиль Найти все сообщения от Artem_Andreev
 
Регистрация: 16.08.2018
Сообщений: 4

Прошу помочь с решением проблемы с this
Как сделать так. чтобы не было таких вызовов как: weather.getRequest(link) и прочее, а было например this.getRequest(link)
Спасибо заранее за ваши ответы!

'use strict'

var weather = {
  id: 0,
  showWeather: function() {
       var target = {
        latitude: 0,
        longitude: 0
      };
      function getPosition(position) {
        var crd = position.coords;
        if (target.latitude === crd.latitude && target.longitude === crd.longitude) {
          navigator.geolocation.clearWatch(id)
        }
        var link = 'http://api.openweathermap.org/data/2.5/weather?lat=' + crd.latitude + '&lon=' + crd.longitude  + '&units=metric&lang=ru&appid=b231606340553d9174136f7f083904b3';
        weather.getRequest(link);
       }
       return this.id = navigator.geolocation.watchPosition(getPosition);

  },
  getRequest: function(link) {
    var request = new XMLHttpRequest();
    request.open('GET', link , true)
    request.onreadystatechange = function(e) {
      if (this.readyState == 4) {
        if(this.status == 200) {
          var response = JSON.parse(this.responseText);
          console.log(response);
          weather.showWeatherData(response);
          }
        }
      }
    request.send(null);
  },
  showWeatherData: function(response) {
    var temp = response.main.temp;
    var hum = response.main.humidity;
    var descrpt = response.weather[0].description;
    temperature.innerHTML = temp;
    humidity.innerHTML = hum;
    description.innerHTML = descrpt;
  },
  showCityWeather: function() {
    function getPosition() {
      var cityName = choiseCityName.value;
      var link = 'http://api.openweathermap.org/data/2.5/weather?q=' + cityName + '&units=metric&lang=ru&appid=b231606340553d9174136f7f083904b3';
      weather.getRequest(link);
  }
    navigator.geolocation.clearWatch(this.id)

    console.log(this.id)
   return this.id = navigator.geolocation.watchPosition(getPosition);
  }
}
Ответить с цитированием
  #2 (permalink)  
Старый 17.08.2018, 00:04
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от Artem_Andreev
чтобы не было таких вызовов как: weather.getRequest(link)
вызывать в подходящем контексте
например в 10 строке можно заменить функцию на стрелочную, у нее нет своего контекста и она возьмет контекст weather, после этого можно вызвать внутри функции this.getRequest(link);

getPosition =(position)=> {
        var crd = position.coords;
        if (target.latitude === crd.latitude && target.longitude === crd.longitude) {
          navigator.geolocation.clearWatch(id)
        }
        var link = 'http://api.openweathermap.org/data/2.5/weather?lat=' + crd.latitude + '&lon=' + crd.longitude  + '&units=metric&lang=ru&appid=b231606340553d9174136f7f083904b3';
        this.getRequest(link);
       };
Ответить с цитированием
  #3 (permalink)  
Старый 17.08.2018, 08:41
Новичок на форуме
Отправить личное сообщение для Artem_Andreev Посмотреть профиль Найти все сообщения от Artem_Andreev
 
Регистрация: 16.08.2018
Сообщений: 4

Сообщение от j0hnik Посмотреть сообщение
вызывать в подходящем контексте
например в 10 строке можно заменить функцию на стрелочную, у нее нет своего контекста и она возьмет контекст weather, после этого можно вызвать внутри функции this.getRequest(link);

getPosition =(position)=> {
        var crd = position.coords;
        if (target.latitude === crd.latitude && target.longitude === crd.longitude) {
          navigator.geolocation.clearWatch(id)
        }
        var link = 'http://api.openweathermap.org/data/2.5/weather?lat=' + crd.latitude + '&lon=' + crd.longitude  + '&units=metric&lang=ru&appid=b231606340553d9174136f7f083904b3';
        this.getRequest(link);
       };

Я все сделал так, но консоль ругается
script1.js:10 Uncaught ReferenceError: getPosition is not defined


UPD: Нужно было просто через var объявить и все заработало

Последний раз редактировалось Artem_Andreev, 17.08.2018 в 08:45.
Ответить с цитированием
  #4 (permalink)  
Старый 17.08.2018, 08:48
Новичок на форуме
Отправить личное сообщение для Artem_Andreev Посмотреть профиль Найти все сообщения от Artem_Andreev
 
Регистрация: 16.08.2018
Сообщений: 4

А как в этом куске избавиться от weather?

getRequest: function(link) {
    var request = new XMLHttpRequest();
    request.open('GET', link , true)
    request.onreadystatechange = function(e) {
      if (this.readyState == 4) {
        if(this.status == 200) {
          var response = JSON.parse(this.responseText);
          console.log(response);
          weather.showWeatherData(response);
          }
        }
      }
    request.send(null);
  },
Ответить с цитированием
  #5 (permalink)  
Старый 17.08.2018, 08:56
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

getRequest: function(link) {
    var $this = this;
    var request = new XMLHttpRequest();
    request.open('GET', link , true)
    request.onreadystatechange = function(e) {
      if (this.readyState == 4) {
        if(this.status == 200) {
          var response = JSON.parse(this.responseText);
          console.log(response);
          $this.showWeatherData(response);
          }
        }
      }
    request.send(null);
  },


так например
Ответить с цитированием
  #6 (permalink)  
Старый 17.08.2018, 15:54
Новичок на форуме
Отправить личное сообщение для Artem_Andreev Посмотреть профиль Найти все сообщения от Artem_Andreev
 
Регистрация: 16.08.2018
Сообщений: 4

Спасибо. А можете дать какие-нибудь рекомендации по написанию кода. Т.е оценить этот
Ответить с цитированием
  #7 (permalink)  
Старый 17.08.2018, 21:33
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Artem_Andreev,
Переменных лишних много, если значение используется один раз, то нет смысла его сохранять в переменную. Запрос по городу вообще не зависит от геолокации, поэтому нет смысла getPosition в showCityWeather. Также не понятно зачем target в showWeather, если нет нужды стремиться к определенному местоположению.

Последний раз редактировалось Rise, 17.08.2018 в 21:36.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помочь: скрипт для вывода текущего года. Denis345 Серверные языки и технологии 10 07.08.2018 14:49
Прошу помочь найти ошибки в функциях Georka Элементы интерфейса 1 02.10.2014 10:08
Прошу помочь оптимизировать код Master_Sergius Общие вопросы Javascript 16 05.08.2014 19:16
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37
Прошу помочь с проверкой формы ввода Гость Общие вопросы Javascript 2 08.03.2008 12:10