Создание объекта getJSON - PullRequest
       14

Создание объекта getJSON

0 голосов
/ 09 декабря 2011

Я получил успешный вызов на контроллер базы данных coldfusion с использованием метода getJSON jQuery.Возвращенная информация возвращается в формате:

{
    "COLUMNS": ["PRODUCT_HIERARCHY", "WEBPRODLINE", "POSITION", "FEATURES", "BENEFITS", "LINKS", "VIDEOS", "IMAGE_CUTAWAY", "MARKEDASNEW"],
    "DATA": [
        ["23456689", "ProdName1", "A Feature 1", "A Benefit 1", "url", "vid_url", "img_name", "N"],
        ["234566891", "ProdName2", "A Feature 2", "A Benefit 2", "url", "vid_url", "img_name", "N"]
    ]
}

Теперь я хочу сохранить возвращенную информацию как объект, который я затем могу отфильтровать локально, вместо того, чтобы сделать еще один вызов БД.Проблема в функции initializeView.Вот соответствующий сценарий:

$(document).ready(function() {

    var productsFlag = false;
    var enableLog = true;

    var allProducts = $.getJSON(jsonURL, { method: "getAllProducts", returnformat: "json" }, function(data) {
        productsFlag = true;
    });

    waitOnJson();

    function waitOnJson() {
        //this shows up in the log
        logThis('areProductsReady?');
        if (productsFlag) {
            //this shows up in the log
            logThis('productsFlags ready');
            initializeProductView();
        } else {
            //this shows up in the log
            logThis('productsFlags not ready');
            t = setTimeout(waitOnJson, 100);
        }
    }

    function initializeProductView() {
        //this shows up in the log
        logThis('initializeProductView');
        //this displays [object Object]
        alert(allProducts);
        //this displays undefined
        alert(allProducts.DATA);
        $.each(allProducts.DATA, function(i, item) {
            //this doesn't show up in the log
            logThis(item[1]);
        });
    }

    //as you can tell, this writes out to a debug console on the page
    function logThis(eventString) {
        if (enableLog === true) {
            $('<p/>').append(eventString).appendTo("#log");
        }
    }

});

Я уверен, что проблема в том, что я не понимаю, что возвращает getJSON, но у меня либо слишком много кофеина, либо недостаточно, и я не вижуЭто.ПОМОГИТЕ!

Кроме того, есть какие-нибудь мысли о моем шаге ожидания блокировки?Я хочу использовать данные в нескольких различных функциях, но мне также нужно подождать, пока они загрузятся, прежде чем инициализировать представление.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Перво-наперво, вам не нужно ждать ответа json, как вы.Функция в вашем вызове метода getJSON возвращается только при получении ответа.Когда это происходит, он возвращает результаты вашего вызова JSON в качестве первого аргумента вызова метода.Так что вы можете просто сделать что-то вроде этого (для простоты я вычеркнул многие ваши вещи):

$(document).ready(function() {

    $.getJSON(jsonURL,
    {
        method: "getAllProducts",
        returnformat: "json"
    }, function(allProducts) {  //This function only executes when the response is received.

        //You access your products array here and do whatever you need with them
        alert(allProducts != null);

    });


});

Надеюсь, это немного прояснит ситуацию.

РЕДАКТИРОВАТЬ: После прочтения вашего комментария, если вы запутались в предупреждениях в вашем методе initializeProductView, возможно, это связано с тем, что метод getJSON не возвращает результат запроса JSON AJAX, он возвращает объект jqXHR .Вот почему атрибут .DATA не определен.Если бы вы что-то сделали для этого, это могло бы сработать (при условии, что у вашего возвращенного JSON есть член .DATA):

var allProducts = null;

$.getJSON(jsonURL,
    {
        method: "getAllProducts",
        returnformat: "json"
    },
    function(data) {
        productsFlag = true;
        allProducts = data;
    }
);

Извините за ранее недоразумение.

0 голосов
/ 09 декабря 2011

Почему бы просто не выполнить всю работу, выполняемую на шаге ожидания, в анонимной функции обратного вызова, отправленной в .getJSON()?Это намного чище, и вам не нужно продолжать делать setTimeout концерт.

Что касается того, что происходит с initializeProductView(), это, очевидно, вызывается.Пожалуйста, отправьте код для этого.Вам определенно нужно что-то делать с параметром data в обратном вызове.Прямо сейчас это не используется.

Для справки и более пристального взгляда, вот страница getJSON: http://api.jquery.com/jQuery.getJSON/


РЕДАКТИРОВАТЬ: Вы ничего не делаете сОтвет JSON.В обратном вызове вы должны что-то делать с данными парм.Как вы получаете к нему доступ в initializeProductView()?


РЕДАКТИРОВАТЬ 2: Ваша анонимная функция, вызываемая ready, неправильно закрыта.


РЕДАКТИРОВАТЬ 3: ПринимаяПри ближайшем рассмотрении вы определили waitOnJson(), initializeProductView() и logThis() как методы анонимной функции.Когда выполняется вызов функций, вы вызываете их, как если бы они были функциями верхнего уровня.Ваша анонимная функция должна действительно выполнять работу, а не определять функции для вызова.

...