我想创建一个辅助方法,可以包含在包含的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一样......
答案 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键的符号。我不知道,但这就是我要做的。