将加载的json传递给多个函数

时间:2016-05-27 07:58:05

标签: jquery function

所以我有一些函数可以做多个事情但是我需要传递一个json对象通过它们中的大多数。原因背后的原因是需要使用多个jsons。

我使用函数加载我的json ...

function LoadJSON(path) {
    $.getJSON(path, function() { })
        .done(function(results) { return results; })
        .fail(function() { alert("Error loading content."); });
}

...从那里我尝试将其加载到函数中......

function LoadScene(button) {
    ...
    LoadButtons(LoadJSON('js/content.json'), id); // id is determined in code
}

...最后我尝试访问我最需要它的函数中的数据......

function LoadButtons(obj, id) {
    alert(obj['data']);
}

...我设法直接加载它而没有加载函数或将它从一个函数传递到另一个函数,但为了使我的代码更有效,我需要正确地分离事物。

然而,它无法正常工作:我已经设法在LoadButtons函数中使用了ajax调用,但是当我将它分成三个独立的函数时,它不会工作并且警报会返回&#34 ;未定义"

为什么这不能解决我的实施方式?

1 个答案:

答案 0 :(得分:2)

您的LoadJSON将不会返回 json,因为它是异步的 - 因此LoadButtons(LoadJSON())将无效。

您需要为成功传递回调函数,例如:

function LoadJSON(path, ondone) {
    $.getJSON(path, function() { })
        .done(function(results) { 
            if ($.isFunction(ondone)) ondone(results);
        })
        .fail(function() { alert("Error loading content."); });
}

function LoadDone(json)
{
    .. work with json
}

// call with:

LoadJSON('js/content.json', function(results) { LoadDone(results); })
//or
LoadJSON('js/content.json', LoadDone )

或直接使用承诺:

function LoadJSON(path, ondone) {
    return $.getJSON(path, function() { })
        .fail(function() { alert("Error loading content."); });
}

LoadJSON('js/content.json')
    .done(function(results) {
        LoadDone(results)
    });

我想在这里添加一些关于return的细节:

function LoadJSON(path) {
    $.getJSON(path, function() { })
        .done(function(results) { return results; })
        .fail(function() { alert("Error loading content."); });
}

首先,我要补充说LoadJSON中没有return所以你总是得到null,但是“kind-of”是一个返回,它在.done中。但这不是LoadJSON的一部分,因为它稍后发生(因为$.getJSON是异步的)

所以会发生什么:

  • LoadJSON启动
  • 看到$ .getJSON然后:好的 - 我会根据您提供的详细信息启动ajax调用,立即返回
  • LoadJSON退出(没有return语句,因此返回 null
  • 然后ajax调用完成并点击.done,它只返回结果返回jquery ajax处理程序