我使用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返回的内容缺乏了解,但我要么喝太多咖啡因还是不够咖啡因而且我没有看到它。帮助!
另外,关于我的阻塞等待步骤的任何想法?我希望能够在几个不同的函数中使用数据,但我还需要在初始化视图之前等待它加载。
答案 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()
定义为匿名函数的方法。当对函数进行调用时,您将它们称为顶层函数。你的匿名函数应该只是工作,而不是定义要调用的函数。