2013-05-09 88 views
0

所以我有一个用于宾果游戏的脚本。我在另一个函数中运行我的一个函数时遇到问题。这个想法是让我的checkBingo()函数在.click()函数之外定义。在工作中有一些Ajax,所以我不确定这是否也会发挥作用。看起来像这样:Javascript整理嵌套函数

$(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. 
     } 
    } 
    }): 
}); 

在哪里我挂断了,是isBingo是从来没有得到分配的返回信息。我认为这可能是因为查询运行速度不够快,所以我试图在循环中粘贴变量,直到它获得分配给它的东西,然后控制台告诉我,我的checkcingo()函数在.click函数内没有定义。我不确定这是否是我的一个愚蠢的语法错误,或者我所做的事情是不可能的。

有人可以验证这确实是可能的,我可能只是要冲刷它的语法错误?

+0

只需使用它的url并查看你回来的内容,就可以在浏览器中自行运行check-bingo。 – 2013-05-09 23:10:12

+0

为什么有冒号':'应该有分号? – 2013-05-09 23:12:11

+0

@ Qantas94Heavy:哪里? – Blender 2013-05-09 23:13:50

回答

3

因为该行:

var isBingo = checkBingo(); 

...呼吁这使得异步调用,并且不返回任何东西,isBingo将是不确定的函数(checkBingo)。解决这个

一种方法是一个回调函数传递给checkBingo因为JavaScript允许函数像数据那样来传递,该函数将通过jQuery的时候从服务器获得的数据被称为:

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返回一个允许这个st的promise对象编码YLE:

$(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. 
        } 
       }); 
      } 
     }); 
    }); 
}); 

除了需要一对夫妇的冒号转换为分号,并添加了jQuery $在你的“#div”代码前,其他两个方面需要注意:

  1. 我在Ajax调用中添加了“.txt”扩展名,以防扩展名仅仅隐藏在系统中。
  2. 代码$('#div')推测您的页面上有一个ID设置为“div”的元素。如果您希望所有div元素都可点击,则只需执行$('div')即可。
+1

为什么'callback(data)'之前有'return'? – 2013-05-09 23:25:15

+0

因为我没在想。 :)当然,这没有什么坏处,但是我把它删除了。 – 2013-05-09 23:32:48

+0

你已经有了我的投票权,Async对于刚刚学习JavaScript的人来说可能很奇怪。 – 2013-05-09 23:48:51