所以我有一个宾果游戏的脚本。我在另一个函数中运行我的一个函数时遇到问题。我的想法是让我的checkBingo()函数在.click()函数之外定义。工作中有一些ajax,所以我不确定它是否也会在这里发挥作用。看起来像:
$(document).ready(function(){
function checkBingo() {
$.ajax({
url: '/check-bingo',
type: 'GET',
success: function(data){
return data;
}
}):
}
$('#div').click(function() {
// Some stuff gets done here
$.ajax({
url: '/tile',
type: 'GET',
success: function(data){
// Does some stuff with data, then needs to check if there's a bingo.
var isBingo = checkBingo();
if (isBingo == 'something') {
// Displays something specific on the page.
} else {
// Displays other things on the page.
}
}
}):
});
我挂断的地方,就是那个宾果永远不会被分配回信息。我认为可能是因为查询运行速度不够快,所以我尝试将变量放在一个循环中,直到它分配给它,然后控制台告诉我在.click函数中的checkBingo()没有定义。我不确定这只是一个愚蠢的语法错误,或者我正在做的事情是不可能的。
有人可以验证这确实是可能的,并且我可能只是为了语法错误而搜索它吗?
答案 0 :(得分:3)
因为这一行:
var isBingo = checkBingo();
...正在调用一个函数(checkBingo
),该函数进行异步调用并且不返回任何内容,isBingo
将是未定义的。
解决这个问题的一种方法是将回调函数传递给checkBingo
,因为JavaScript允许函数像数据一样传递,当从服务器获取数据时,jQuery将调用该函数: / p>
function checkBingo(callback) {
$.ajax({
url: '/check-bingo',
type: 'GET',
success: function(data){
callback(data);
}
// or you could just do:
// success: callback,
});
}
// ....
success: function(data){
checkBingo(function (isBingo) {
if (isBingo == 'something') {
// Displays something specific on the page.
} else {
// Displays other things on the page.
}
});
另一种方法,将允许您继续使用同步样式(即,checkBingo
可以返回某些内容并且您可以立即使用它),即使代码未同步执行通过利用jQuery的Ajax API的更高版本返回一个允许这种编码风格的promise对象这一事实:
$(document).ready(function(){
function checkBingo() {
return $.ajax({
url: '/check-bingo.txt',
type: 'GET'
});
}
$('#div').click(function() {
// Some stuff gets done here
$.ajax({
url: '/tile.txt',
type: 'GET',
success: function(data){
var checkingBingo = checkBingo();
checkingBingo.done(function (isBingo) {
if (isBingo == 'something') {
alert('a');
// Displays something specific on the page.
} else {
alert('b');
// Displays other things on the page.
}
});
}
});
});
});
除了需要将几个冒号转换为分号,并在“#div”代码前添加jQuery $
,还需要注意以下两个方面:
$('#div')
假设您的网页上有一个ID设置为“div”的元素。如果您希望所有div
元素都可以点击,则只需$('div')
。