Javascript整理嵌套函数

时间:2013-05-09 23:07:20

标签: javascript jquery ajax

所以我有一个宾果游戏的脚本。我在另一个函数中运行我的一个函数时遇到问题。我的想法是让我的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()没有定义。我不确定这只是一个愚蠢的语法错误,或者我正在做的事情是不可能的。

有人可以验证这确实是可能的,并且我可能只是为了语法错误而搜索它吗?

1 个答案:

答案 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 $,还需要注意以下两个方面:

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