创建getJSON对象

时间:2011-12-08 20:26:00

标签: jquery asynchronous getjson wait

我使用jQuery的getJSON方法成功调用了coldfusion数据库控制器。返回的信息以以下格式返回:

{
    "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"]
    ]
}

我现在想将返回的信息存储为一个对象,然后我可以在本地过滤而不是再次调用db。问题出在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 个答案:

答案 0 :(得分:2)

首先,你不应该像你一样等待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 object。这就是.DATA属性未定义的原因。如果你做了一些这样的事情,它可能会起作用(假设你返回的JSON有一个.DATA成员):

var allProducts = null;

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

对我之前的误解感到抱歉。

答案 1 :(得分:0)

为什么不在.getJSON()中提交的匿名回调函数中执行当前等待步骤中的所有内容?它更干净,你不必继续做setTimeout演出。

关于initializeProductView()发生了什么,它显然被调用了。请发布代码。你肯定需要在回调中使用data parm做一些事情。现在它还没有被使用。

供参考,仔细看看getJSON页面:http://api.jquery.com/jQuery.getJSON/


编辑:您没有对JSON响应做任何事情。在回调中,您应该使用数据parm执行某些操作。您如何在initializeProductView()中访问它?


编辑2:ready调用的匿名函数未正确关闭。


编辑3:仔细研究一下,您已将waitOnJson()initializeProductView()logThis()定义为匿名函数的方法。当对函数进行调用时,您将它们称为顶层函数。你的匿名函数应该只是工作,而不是定义要调用的函数。