使用jquery / json / getJSON创建辅助方法

时间:2011-04-14 07:13:56

标签: javascript jquery json getjson

我想创建一个辅助方法,可以包含在包含的javascript中并轻松引用。 helper方法从jquery ...

包装.getJSON函数
function doSomething(someThing) { 
  $.getJSON(theCoolestURLEver, {auth_key:"barfoo", id:someThing}, function(data) {
   console.log(data);
   return data;
  });
}

在我的普通HTML页面中,我想要做的是:

<html>
<head>
   <script src="/_/js/myCoolFunctions.js"></script>
</head>
<body>
<script>
  var someThing = "foobar";
  var data = doSomething(someThing);
  console.log(data);
</script>
</body>
</html>

最终结果是console.log在第二个代码块中以未定义的形式返回。我现在明白这与范围或页面加载有关,而且当&lt;时,数据不可用。脚本&gt;标签加载。所以...如果这是真的,我如何创建一个可以隐藏一直发生的复杂性的辅助方法?就像添加auth_key一样......

3 个答案:

答案 0 :(得分:4)

问题是AJAX请求(例如$.getJSON)是异步。这意味着函数调用在请求完成之前立即返回。您正在提供回调 - 此功能在收到数据后运行; 之后 console.log

(另外一点,return只设置处理程序的返回值,而不是doSomething函数。)

我认为,最好的方法是创建自己的辅助方法:

$.getJSONAuth = function(url, data, success) {
    var authData =  {auth_key:"barfoo"};

    if ($.type(data) === 'function') {
        success = data;
        data = authData;
    } else {
        data = $.extend({}, authData, data);
    }

    return $.ajax({
        url: url,
        type: 'GET',
        dataType: 'json',
        success: success,
        data: data
    });
}

您现在可以这样称呼:

$.getJSONAuth(theCoolestURLEver, {id:someThing}, function(data) {
    console.log(data);
});

答案 1 :(得分:1)

你的doSomething函数没有返回任何东西,getJSON的回调函数也没有。 getJSON执行异步,因此doSomething函数在请求完成之前结束。您可以将函数传递给doSomething函数:

function doSomething(someThing, callback) { 
  $.getJSON(theCoolestURLEver, {auth_key:"barfoo", id:someThing}, function(data) {
   callback(data)
   return data;
  });
}

并称之为:

<script>
  var someThing = "foobar";
  doSomething(someThing, function(data) { console.log(data); });
</script>

答案 2 :(得分:-1)

如果你这样做:

$.getJSON(theCoolestURLEver, {'auth_key:"barfoo"', 'id:someThing'}, function(data)

注意'围绕json键的符号。我不知道,但这就是我要做的。