Нужна помощь в разборе - PullRequest
       1

Нужна помощь в разборе

0 голосов
/ 15 февраля 2012

Это вид из моего браузера:

{
    "data": {
        "request": [{
            "query": "Lat 41.85 and Lon -87.65",
            "type": "LatLon"
        }],
        "time_zone": [{
            "localtime": "2012-02-14 16:05",
            "utcOffset": "-6.0"
        }]
    }
}

Теперь я использую этот код для его анализа:

function getTimeZone(latlong) {
    jQuery(document).ready(function ($) {
        $.ajax({
            url: "http://www.worldweatheronline.com/feed/tz.ashx?key=[removed]&q=" + latlong + "&format=json",
            dataType: "jsonp",
            success: function (parsed_json) {
                console.log(parsed_json.time_zone.utcOffset);
                return parsed_json.time_zone.utcOffset;
            },
            error: function (parsed_json) {
                //console.log("Error: " + parsed_json);
            }
        });
    });
}

Каждый раз, когда я запускаю код, я получаюэта ошибка:

Uncaught TypeError: Cannot read property 'utcOffset' of undefined

Любая помощь будет принята с благодарностью.

Просмотр данных, отображаемых на консоли (копируется только интересующая меня часть):

Result:
  Object
    data: Object
      request: Array[1]
        time_zone: Array[1]
          0: Object
            localtime: "2012-02-14 16:46"
            utcOffset: "-6.0"

Ответы [ 3 ]

3 голосов
/ 15 февраля 2012

На самом деле есть две проблемы:

1) для доступа к контенту вам необходимо:

parsed_json.data.time_zone [0] .utcOffset;

2) Это немного сложнее - вы используете асинхронный обратный вызов ajax - success () не вызывается до того, как ваша программа завершает отправку запроса ajax и возвращает его, и она не возвращает свои результаты родительскому методу.

Практически невозможно сделать это так, как вы хотите, если только вы не используете синхронную выборку (плохая идея, поскольку она блокирует ваш браузер до получения ответа).

Вместо этого возьмите параметр обратного вызова, который будет функцией, в качестве параметра вашей функции и вызовите его с результатом, как только он прибудет:

т.е.

function getTimeZone(latlong, callback) {
    jQuery(document).ready(function ($) {
        $.ajax({
            url: "http://www.worldweatheronline.com/feed/tz.ashx?key=[removed]&q=" + latlong + "&format=json",
            dataType: "jsonp",
            success: function (parsed_json) {
                console.log(parsed_json.time_zone.utcOffset);
                callback(latlong, parsed_json.data.time_zone[0].utcOffset);
            },
            error: function (parsed_json) {
                //console.log("Error: " + parsed_json);
            }
        });
    });
}

Затем использовать его:

getTimeZone(myLatLong, function(latLong, utcOffset) {
   // ... do something with utcOffset here ...
});
1 голос
/ 15 февраля 2012

Должно быть

return parsed_json.data.time_zone[0].utcOffset;

Необходимо внимательно посмотреть на возвращенную структуру JSON.Это помогает разбить его на отдельные строки и сделать отступ для отражения вложенности.

0 голосов
/ 15 февраля 2012

должно быть parsed_json.data.time_zone[0].utcOffset?

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