Javascript排序嵌套函数

Javascript排序嵌套函数,javascript,jquery,ajax,Javascript,Jquery,Ajax,所以我有一个宾果游戏的脚本。我在另一个函数中运行一个函数时遇到问题。其想法是在.click()函数之外定义我的checkBingo()函数。有一些ajax在工作,所以我不确定这是否也在起作用。看起来像: $(document).ready(function(){ function checkBingo() { $.ajax({ url: '/check-bingo', type: 'GET', success: function(data){

所以我有一个宾果游戏的脚本。我在另一个函数中运行一个函数时遇到问题。其想法是在.click()函数之外定义我的checkBingo()函数。有一些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.
        }
  }
  }):
});
我被挂断的地方是,isBingo从未被分配返回的信息。我想这可能是因为查询的运行速度不够快,所以我尝试将变量放入循环中,直到它得到分配给它的内容,然后控制台告诉我.click函数中的checkBingo()没有定义。我不确定这是否只是我一个愚蠢的语法错误,或者我正在做的是不可能的

有人能证实这确实是可能的吗?我可能只是需要搜索一下语法错误?

因为这行:

var isBingo = checkBingo();
…正在调用一个函数(
checkBingo
),该函数进行异步调用且不返回任何内容,
isBingo
将被取消定义

一种方法是将回调函数传递给
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的更高版本返回一个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
$
,还有两个方面需要注意:

  • 我在Ajax调用中添加了“.txt”扩展名,以防扩展名仅仅隐藏在您的系统中
  • 代码
    $('#div')
    假定页面上有一个ID设置为“div”的元素。如果希望所有
    div
    元素都可以单击,只需执行
    $('div')
  • 因为这一行:

    var isBingo = checkBingo();
    
    …正在调用一个函数(
    checkBingo
    ),该函数进行异步调用且不返回任何内容,
    isBingo
    将被取消定义

    一种方法是将回调函数传递给
    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的更高版本返回一个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
    $
    ,还有两个方面需要注意:

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

  • 只需使用浏览器的url,即可在浏览器中运行check bingo,查看您得到了什么。为什么有冒号
    哪里应该有分号?@Qantas94Heavy:where?这行对吗
    (“#div”)。单击(function(){
    -看起来它在开头缺少了一个
    $
    。这加上其他语法错误。你有语法检查编辑器吗?如果你将代码加载到编辑器中,它将以扭曲的红色下划线显示你的错误。你在
    (“#div”)
    之前缺少一个
    $
    。此外,AJAX是异步的(这就是A所代表的),所以返回数据不会有任何用处。只需使用浏览器的url在浏览器中运行check bingo,查看返回的内容。为什么有冒号
    哪里应该有分号?@Qantas94Heavy:where?这行正确吗?
    ('#div')。单击(函数(){
    -看起来它在开始时缺少了一个
    $
    。这加上其他语法错误。你有语法检查编辑器吗?如果你将代码加载到其中,它将显示带有扭曲的红色下划线的错误。你在
    ('#div')
    之前缺少了一个
    $
    。此外,AJAX是异步的(这就是a所代表的),所以
    返回数据
    不会做任何有用的事情。为什么在
    回调(数据)
    之前有
    返回
    ?因为我没有思考。:)当然,这没有什么害处,但我删除了它。你已经得到了我的支持,异步对于刚刚学习JavaScript的人来说可能很奇怪。是的,但开始学习是非常重要的。我为第二个调用添加了jQuery的promise API(我也可以为第一个调用添加)如果更简单的话。非常感谢!我使用了你的第二个建议,它工作起来很有魅力。仅供参考,我的url是“/check bingo”,因为它在谷歌的应用程序引擎上,我已经设置了一个处理程序来响应该url。为什么在
    回调(数据)
    之前有
    返回
    ?因为我没有思考。:)当然,这没有什么害处,但我删除了它。你已经得到了我的支持,异步对于刚刚学习JavaScript的人来说可能很奇怪。是的,但开始学习是非常重要的。我为第二个调用添加了jQuery的promise API(我也可以为第一个调用添加)如果更简单的话。非常感谢!我使用了你的第二个建议,效果很好。我的URL是“/check bingo”,因为它在谷歌的应用程序引擎上,我有一个处理程序