Javascript 将getJSON转换为字符串,然后通过字符串循环

Javascript 将getJSON转换为字符串,然后通过字符串循环,javascript,jquery,json,Javascript,Jquery,Json,我的按键功能中包含以下代码: $.getJSON('dimensions.json', function(data) { $.each(data, function(index) { $('#div1').append(index); }); }); 我试图首先获取JSON字符串,将其保存在变量中,然后运行each()。基本上,我想将each()与getJSON()函数分离,因为我不想让它每次按键都获取json文件 我试过这个,但没用: var JSONstr

我的
按键功能中包含以下代码:

$.getJSON('dimensions.json', function(data) {
    $.each(data, function(index) {
        $('#div1').append(index);
    });
});
我试图首先获取JSON字符串,将其保存在变量中,然后运行
each()
。基本上,我想将
each()
getJSON()
函数分离,因为我不想让它每次按键都获取json文件

我试过这个,但没用:

var JSONstr = $.getJSON('dimensions.json');
$.each(JSONstr, function(index) {
    $('#div1').append(index);
});

你掉进了异步陷阱。您的
$。each()
函数不会等待您的
$.getJSON()
调用来获取数据。您可以使用好的'ol
$.ajax()
函数来解决这个问题。像这样:

function processJSON(data) {
    $.each(data, function(index) {
        $('#div1').append(index);
    });
}

$.ajax({
    url: 'dimensions.json',
    dataType: 'json',
    async: false,
    success: processJSON(data)
});

在第一个示例中,您在回调中执行$each。在收到结果后,回调由其他回调执行,$.getJSON会立即返回而不等待结果(因为JavaScript中没有设计阻塞)

因此,第二个示例中的代码永远不会工作:在从web服务器接收到任何结果之前,可能甚至在发送请求之前,就开始使用$。无论$.getJSON的返回值是什么,根据JavaScript的设计,它不能是AJAX请求的结果

UPD:看到你的评论,现在我明白你想做什么了。下面是一个简单的示例,说明如何执行此操作:

function ActualHandler(data) {
    $.each(data, function(index) {
        $('#div1').append(index);
    });
}

function KeypressHandler() {
    if (window.my_data) { // If we have the data saved, work with it
        ActualHandler(window.my_data);
    }
    else { // Otherwise, send the request, wait for the answer, then do something
        $.getJSON('dimensions.json', function(data) {
             window.my_data = data; // Save the data
             ActualHandler(data); // And *then* work on it
        });
    }
}
在这里,在收到数据之前不会启动ActualHandler,一旦发生这种情况,将立即处理所有后续单击


这种特殊情况的缺点是,如果用户在第一个请求运行时再次单击,则会再发送一个请求。但要解决这个问题,您需要维护一些队列,这在这里有点超出范围。

您比较过console.log(数据)和console.log(JSONstr)吗?为什么要这样做?(你不能,这就是我问的原因。)@Pointy-第一个代码片段包含在“keypress”函数中,因此每次按下一个键时,我的脚本都会获取json文件。我想将它提取一次到一个var,然后在var上运行keypress函数。问题是,在回调
$.getJSON
之前,您无法确定变量的值是否可用。您可以做的是将“keypress”处理程序的绑定延迟到回调内部。@hoverhand请用这些额外的信息编辑您的问题,您最初的意思并不明显。(我正在编辑我的答案)但这并没有将each和正在获取的文件分开。他希望$.each()在$.getJSON()回调之外运行。也许你可以将JSON数据保存在一个变量中,然后在KeyPress上使用该变量运行HandleJSON?这正是我的代码所做的,不是吗?除了第一次,在回调的“外部”运行它的唯一替代方法是a)在setInterval回调的内部b)根本不运行它c)在没有任何数据的情况下运行它。在我看来,这些都不是解决问题的办法。